截止到目前我已经写了 500多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载

LeetCode 1004. 最大连续1的个数 III_1004. 最大连续1的个数
LeetCode 1004. 最大连续1的个数 III_1004. 最大连续1的个数_02
LeetCode 1004. 最大连续1的个数 III_LeetCode_03
LeetCode 1004. 最大连续1的个数 III_1004. 最大连续1的个数_04
来看下代码

public int longestOnes(int[] A, int K) {
int left = 0;//窗口左边的位置
int maxWindow = 0;//窗口的最大值
int zeroCount = 0;//窗口中0的个数
for (int right = 0; right < A.length; right++) {
if (A[right] == 0) {
zeroCount++;
}
//如果窗口中0的个数超过了K,要缩小窗口的大小,直到0的个数
//不大于K位置
while (zeroCount > K) {
if (A[left++] == 0)
zeroCount--;
}
//记录最大的窗口
maxWindow = Math.max(maxWindow, right - left + 1);
}
return maxWindow;
}

LeetCode 1004. 最大连续1的个数 III_LeetCode_05

public int longestOnes(int[] A, int K) {
int left = 0;//窗口左边的位置
int right = 0;//窗口右边的位置
int zeroCount = 0;//窗口中0的个数
for (; right < A.length; right++) {
if (A[right] == 0) {
zeroCount++;
}
//如果窗口中0的个数超过了K,要缩小窗口的大小
if (zeroCount > K && A[left++] == 0)
zeroCount--;
}
return right - left;
}

或者还可以更简洁一些,其实原理都一样,换汤不换药。

public int longestOnes(int[] A, int K) {
int left = 0;//窗口左边的位置
int right = 0;//窗口右边的位置
int zeroCount = 0;//窗口中0的个数
for (; right < A.length; right++) {
zeroCount += 1 - A[right];
if (zeroCount > K)
zeroCount -= 1 - A[left++];
}
return right - left;
}



总结

滑动窗口和回溯算法其实都有一个经典的模板,对于回溯算法可以看下​​《450,什么叫回溯算法,一看就会,一写就废》​​。而滑动窗口问题,首先要使用两个指针,一个确定窗口的左边界,一个确定窗口的右边界,其中左边界不动,右边界往右移动,每移动一步都要判断窗口内的值是否满足条件,如果满足,要记录下最优值。如果不满足,左边界在开始移动,相当于缩小窗口……。滑动窗口的题有很多,有时间再对滑动窗口做个总结。