题目
滑动窗口
public class Main {
public static void main(String[] args) {
Main main = new Main();
int [] nums = new int[] {0, 0, 1, 1, 1, 0, 0};
main.longestOnes(nums, 0);
}
public int longestOnes(int[] A, int K) {
// 利用一个逐渐扩大的动态窗口, 如果窗口包含的0个数小于K 则移动右指针
// 否则就平移窗口, 继续判断能否扩大窗口
int left = 0;
int right = 0;
int zeroCount = 0;
while (right < A.length) {
if (A[right] == 0) {
zeroCount ++;
}
if (zeroCount <= K) {
// 可以移动右指针
right ++;
continue;
}
// 平移窗口
if (left < A.length && A[left] == 0) {
zeroCount --;
}
left ++;
right ++;
}
return right - left;
}
}
基本思路
-
利用两个指针形成窗口, 当窗口范围内的0的个数小于等于K的时候, 继续扩大窗口, 否则就平移窗口
-
明确while循环哪里该改变指针, 哪里该修改0的个数, 别弄晕了
滑动窗口2
public class Main {
public static void main(String[] args) {
Main main = new Main();
int [] nums = new int[] {1,1,1,0,0,0,1,1,1,1,0};
main.longestOnes(nums, 2);
}
public int longestOnes(int[] A, int K) {
// 利用一个逐渐扩大的动态窗口, 如果窗口包含的0个数小于K 则移动右指针
// 否则就缩小窗口 移动左边指针
int left = 0;
int right = 0;
int zeroCount = 0;
int max = 0;
while (right < A.length && left <= right) {
if (zeroCount <= K) {
// 可以移动右指针
if (A[right] == 0) {
zeroCount ++;
}
right ++;
} else {
// 缩小窗口
if (A[left] == 0) {
zeroCount --;
}
left ++;
}
if (zeroCount <= K) {
max = Math.max(right - left, max);
}
}
return max;
}
}
基本思路
-
当窗口范围0的个数超过K的时候, 缩小窗口, 直到符合条件, 才继续扩大窗口
-
一定要先判断 再移动指针, 不然边界问题不好处理