滑动窗口算法实战
在处理连续子数组相关的问题时,滑动窗口往往是最直接的解法。今天我们通过两道 LeetCode 经典题,深入理解如何灵活运用双指针维护区间约束。
1. 1004. 最大连续 1 的个数 III
题目核心
这道题其实是在问:在允许最多替换 k 个 0 的前提下,能得到的最长连续 1 的子数组长度是多少?
思路解析
典型的滑动窗口场景。我们需要维护一个窗口,使得窗口内 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;
}
};




