33.最长连续子数组
1.题目介绍
33.最长连续子数组
给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 ,返回仅包含 1 的最长(连续)子数组的长度
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 256M,其他语言512
示例1
输入例子:
[1,1,1,0,0,0,1,1,1,1,0],2
输出例子:
6
例子说明:
可以将输入中的第3个0和第4个0变成1,新数组为[1,1,1,0,0,1,1,1,1,1,1],因此最长连续1的子数组长度为6
示例2
输入例子:
[0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1],3
输出例子:
10
例子说明:
可以将输入中的第3个0、第4个0,第5个0都变成1,新数组为[0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1],因此最长连续1的子数组长度为10
2.题解
2.1 滑动窗口
思路
这里使用标记记录zero的个数,若为超过zero最大个数,即可向后拓展窗口,直到超过最大个数。
这时候将窗口左端向左移动,直到将一个0排除窗口,将标记个数减一,继续拓展窗口。
代码
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param arr int整型一维数组
* @param k int整型 允许0变为1的个数
* @return int整型
*/
public int GetMaxConsecutiveOnes(int[] arr, int k) {
int left = 0;
int zeroNum = 0;
int ans = 0;
for (int right = 0; right < arr.length; right++){
if (arr[right] == 0) zeroNum++;
while (zeroNum > k){
if (arr[left] == 0) zeroNum--;
left++;
}
ans = Math.max(ans,right - left + 1);
}
return ans;
}
}