1004. 最大连续1的个数 III
1004. 最大连续1的个数 III
题目链接:1004. 最大连续1的个数 III
题目描述
给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0,则返回数组中连续 1 的最大个数。
核心思考:滑动窗口与状态变量转化
题意允许我们将最多 k 个 0 翻转为 1,然后求最长全是 1 的子数组长度。如果单纯去模拟每次遇到 0 就翻转它的过程,由于存在 k 个自由额度,会产生大量复杂的分支回溯。
最优雅的破局点在于思维视角的转换:
找寻“翻转不超过 k 个 0 时最长的连续 1 数组”,在逻辑上等价于:寻找一个最长的连续子数组,其中包含的 0 的个数不得超过 k。
有了这个等价转换,本题就毫无悬念地落入了**滑动窗口(Sliding Window)**的经典解题范式:
- 定义状态:相比于直接维护每个被消耗的
k名额,更好维护的是窗口内元素的状态。在这个弹性区间[left, right)内:- 当前的窗口总容积是:
right - left - 当前窗口内拥有的
1数量记录在变量cur_len中。 - 那么变相可知,当前窗口内
0的实际个数直接等于:(right - left) - cur_len。
- 当前的窗口总容积是:
- 扩大窗口:右指针
right不断向右探索扩充疆域,如果扫瞄到1,则同步累加核心状态值cur_len。 - 收缩窗口以保证合法性:一旦发现当前的子数组内
0的数量超过了题设的阈值上限k,说明窗口不再合法。此时必须移动左指针left来淘汰出局最左侧的元素,直到违背约束的状态(超出k限额)被解除,同时若左侧弹出的恰好是1,别忘扣除内部状态cur_len。 - 提取答案:在每次成功稳住合法窗口边界时,动态更新并抓取曾经出现过的最长跨度。
解题思路 (Python)
1 | class Solution: |

复杂度分析
- 时间复杂度:$O(N)$,其中 $N$ 为原二进制数组
nums的规模约束。尽管在代码结构中包含两层嵌套的while环向迭代,但左游标left和右游标right都始终单调向右推移,对于全体数据域的扫描总量被锁定为常数级遍历,实现严谨的线性耗散。 - 空间复杂度:$O(1)$。通篇利用极少的几个整数形态存储(
anscur_len加上双指针),仅依靠纯属的数值游走判定状态越界,在空间资源的统筹节约上做到了极致。