滑动窗口算法精讲
一、1004. 最大连续1的个数 III
题目描述

思路分析
本题的核心是:寻找一个最长的子数组,其中最多包含 k 个 0。这是一道经典的滑动窗口问题。
为什么使用滑动窗口?
- 需要维护连续区间,滑动窗口天然契合。
- 窗口内需满足「0 的个数 ≤ k」的约束条件。
- 窗口扩张:右指针右移,遇到
0则计数器加一。 - 窗口收缩:当
0的个数超过k时,左指针右移直至重新满足条件。
算法流程
- 初始化:
left = 0,zeroCount = 0,maxLen = 0。 - 遍历数组,右指针
right逐步右移:- 若
nums[right] == 0,则zeroCount++。 - 当
zeroCount > k时,收缩左边界:- 若
nums[left] == 0,则zeroCount--。 left++。
- 若
- 更新最大长度:
maxLen = max(maxLen, right - left + 1)。
- 若
- 返回
maxLen。

代码实现
class Solution {
public:
int longestOnes(vector<int>& nums, int k) {
int zero = 0;
int ret = 0;
( left = , right = ; right < nums.(); right++) {
(nums[right] == ) zero++;
(zero > k) {
(nums[left++] == ) zero--;
}
ret = (ret, right - left + );
}
ret;
}
};




