滑动窗口算法实战
滑动窗口是处理连续子数组问题的利器。今天通过两道 LeetCode 题目,深入聊聊双指针在窗口维护中的实际应用。
1004. 最大连续 1 的个数 III

核心思路
这道题的本质是在数组中找一个最长的子数组,要求其中最多包含 k 个 0。
为什么选滑动窗口?因为我们需要的是连续区间,而窗口天然适合维护这种约束。逻辑很简单:
- 扩张:右指针不断右移,遇到 0 就计数。
- 收缩:一旦 0 的数量超过 k,左指针就得右移,直到满足条件。
整个过程就像推着一个框在数组上移动,始终保证框内的 0 不超过限制。
代码实现
class Solution {
public:
int longestOnes(vector<int>& nums, int k) {
int zero = 0;
int ret = 0;
for (int left = 0, right = 0; right < nums.size(); right++) {
if (nums[right] == 0) zero++; // 进窗口
while (zero > k) { // 判断是否越界
if (nums[left++] == 0) zero--; // 出窗口
}
ret = max(ret, right - left + 1);
}
return ret;
}
};
注意这里 left 和 right 的同步更新,以及 while 循环确保窗口始终合法。



