python-leetcode-最大连续1的个数-III
目录
python-leetcode-最大连续1的个数 III
[1004 最大连续1的个数 III - 力扣(LeetCode)](
consecutive-ones-iii/description/?envType=study-plan-v2&envId=leetcode-75
“1004. 最大连续1的个数 III - 力扣(LeetCode)”)
使用滑动窗口 的方法来解决这个问题。
思路:
- 使用双指针(滑动窗口) ,定义左右边界
left
和right
。 - 维护窗口内最多包含
k
个 0。 - 当窗口内的 0 超过
k
个时,移动left
指针,缩小窗口,直到窗口内的 0 个数满足条件。 - 计算窗口的最大宽度,即最长连续 1 的个数。
代码:
def longestOnes(nums, k): left = 0 max_length = 0 zero_count = 0 for right in range(len(nums)): if nums[right] == 0: zero_count += 1 while zero_count > k: if nums[left] == 0: zero_count -= 1 left += 1 max_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 的子数组,适用于大规模数据。