题目描述:
给定一个二进制数组,你可以最多翻转一个 成
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),使用了常数个额外空间。
这种方法高效且直观,利用滑动窗口的技巧很好地解决了问题。希望这个解释对你有所帮助!如果有其他问题,欢迎继续提问。
发表回复