题目描述:
给定一个二进制数组,你可以最多翻转一个 成 1,求最长连续 1 的个数。
示例:
输入: [1,0,1,1,0]
输出: 4
解释: 翻转第二个 0 可以得到最长的连续 1 的序列。
解题思路:
这道题可以使用滑动窗口的技巧来解决。滑动窗口的思路是维护一个窗口,这个窗口内最多包含一个 ,然后计算这个窗口的长度。
具体步骤:
-
初始化变量:
left和right指针,表示窗口的左右边界。zero_count记录窗口内的个数。max_len记录最长连续1的长度。
-
滑动窗口:
- 使用
right指针遍历数组。 - 如果当前元素是
,zero_count增加。 - 如果
zero_count超过1,说明窗口内有两个,需要移动left指针,直到zero_count重新变为1。 - 在每次移动
right指针后,更新max_len为right - left + 1。
- 使用
-
返回结果:
- 遍历结束后,
max_len就是所求的最长连续1的长度。
- 遍历结束后,
代码实现:
def findMaxConsecutiveOnes(nums):
left = 0
zero_count = 0
max_len = 0
for right in range(len(nums)):
if nums[right] == 0:
zero_count += 1
while zero_count > 1:
if nums[left] == 0:
zero_count -= 1
left += 1
max_len = max(max_len, right - left + 1)
return max_len
示例
nums = [1, 0, 1, 1, 0] print(findMaxConsecutiveOnes(nums)) # 输出: 4
解释:
left和right指针用于维护滑动窗口的边界。zero_count用于记录当前窗口内的个数。- 当
zero_count超过1时,说明窗口内有两个,需要移动left指针,直到窗口内只有一个。 - 每次移动
right指针后,更新max_len为当前窗口的长度。
复杂度分析:
- 时间复杂度: O(n),其中 n 是数组的长度。每个元素被访问两次(一次是
right指针,一次是left指针)。 - 空间复杂度: O(1),使用了常数个额外空间。
这种方法高效且直观,利用滑动窗口的技巧很好地解决了问题。希望这个解释对你有所帮助!如果有其他问题,欢迎继续提问。