滑动窗口算法实战
1. 1004. 最大连续 1 的个数 III
题目描述
思路分析
这道题的核心是:找一个最长的子数组,其中最多包含 k 个 0。
经典的 滑动窗口 问题。
为什么用滑动窗口?
- 我们需要连续区间 → 滑动窗口天然适合
- 窗口内维护「0 的个数 ≤ k」这个约束
- 窗口扩张:右指针右移,遇到 0 就计数
- 窗口收缩:当 0 的个数超过 k,左指针右移直到满足条件
算法流程
1. 初始化:left = 0, zeroCount = 0, maxLen = 0
2. 遍历数组,right 指针右移:
- 如果 nums[right] == 0,zeroCount++
- 当 zeroCount > k 时,收缩左边界:
- 如果 nums[left] == 0,zeroCount--
- left++
- 更新 maxLen = max(maxLen, right - left + 1)
3. 返回 maxLen
代码实现
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++] == ) zero--;
}
ret = (ret, right - left + );
}
ret;
}
};


