题目:
题解:滑动窗口
代码:滑动窗口
public class code1004 {
// 利用滑动窗口来解决,即利用 left,right 来记录窗口的大小
// 利用窗口内的 zero 来记录0的数量
public static int longestOnes(int[] A, int K) {
int left = 0; // 滑动窗口区间左端点
int right = 0; // 滑动窗口区间右端点
int max = 0; // 最终结果
int zero = 0; // 统计0的个数
// 滑动窗口表示的区间为[left,right),左闭右开
while(right < A.length)
{
if(A[right++] == 0) // 窗口扩充一个元素,如果为 0 则 zero++;
{
zero++;
}
// 如果窗口内的 0 的数量大于 K 的话,就需要移动窗口的左边界
// 当窗口内 0 的个数超过 K 时候,开始收缩窗口
while(zero > K) // 0 的数量大于 K
{
if(A[left++] == 0) // 如果刚滑出窗口的元素是 0,则 zero--;
{
zero--;
}
}
// 此时 zero <= K,保存窗口的最大宽度
int count = right - left;
if(count > max)
{
max = count;
}
}
return max;
}
public static void main(String[] args) {
int arr1[] = { 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0 };
int k1 = 2;
int res1 = longestOnes(arr1, k1);
System.out.println(res1);
int arr2[] = { 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1 };
int k2 = 3;
int res2 = longestOnes(arr2, k2);
System.out.println(res2);
}
}