滑动窗口算法实战:两道经典题深度解析
滑动窗口是处理连续子数组或子串问题的利器,核心在于用双指针维护一个满足特定条件的区间。今天通过两道 LeetCode 题目,聊聊如何灵活运用这个技巧。
1. 最大连续 1 的个数 III
题目链接: LeetCode 1004

思路拆解
这道题的本质其实很简单:在数组里找一段最长的连续区间,要求里面 0 的数量不超过 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);
}
ret;
}
};




