1004. 最大连续1的个数 III - 力扣(LeetCode)
使用滑动窗口的方法来解决这个问题。
思路:
- 使用双指针(滑动窗口),定义左右边界
left
和right
。 - 维护窗口内最多包含
k
个 0。 - 当窗口内的 0 超过
k
个时,移动left
指针,缩小窗口,直到窗口内的 0 个数满足条件。 - 计算窗口的最大宽度,即最长连续 1 的个数。
代码:
def longestOnes(nums, k):left = 0max_length = 0zero_count = 0for right in range(len(nums)):if nums[right] == 0:zero_count += 1while zero_count > k:if nums[left] == 0:zero_count -= 1left += 1max_length = max(max_length, right - left + 1)return max_length
复杂度分析:
- 时间复杂度:O(n),其中 nn 是数组的长度,每个元素最多被访问两次(一次由
right
访问,一次由left
访问)。 - 空间复杂度:O(1),仅使用了有限的额外变量。
示例:
nums = [1,1,0,0,1,1,1,0,1,1,0,1]
k = 2
print(longestOnes(nums, k)) # 输出 8
这个方法通过滑动窗口高效地找到最长的连续 1 的子数组,适用于大规模数据。