

一、例题精讲
1.1. 最大连续 1 的个数 III
题目给定一个二进制数组,最多允许翻转 k 个 0。注意是'最多'而非'恰好',如果数组中 0 的总数小于 k,则无需额外操作。
直接模拟翻转过程代码会显得繁琐。我们可以转换思路:寻找一个最长的子数组,其中包含的 0 的个数不超过 k。这样就不需要真正去修改数组元素。
暴力解法容易想到:固定起点向右扩展,统计 0 的数量,一旦超过 k 就停止。但这会导致时间复杂度较高。优化后的做法是使用同向双指针(滑动窗口)。
定义 left 和 right 指针,初始指向数组头部。right 负责扩张窗口,遇到 0 时计数器加一;当 0 的个数超过 k 时,left 开始收缩窗口,直到满足条件。在这个过程中,right 不需要回退,这是滑动窗口的核心优势。
步骤概括为:进窗口 → 判断条件 → 出窗口 → 更新结果。
public class Solution {
public int longestOnes(int[] nums, int k) {
int ret = 0;
int zero = 0;
for (int left = 0, right = 0; right < nums.length; right++) {
if (nums[right] == 0) {
zero++;
}
while (zero > k) {
if (nums[left++] == 0) {
zero--;
}
}
ret = Math.max(ret, right - left + 1);
}
ret;
}
}


