解法一:暴力枚举
- 先定义left和right双指针,left先固定在起始位置,遍历right++
- 当值等于1的时候,直接跳过,等于0的时候,zero计数器加一
- 当zero等于k的时候,就开始记录此时最大长度是多少
- 然后left加一,right返回在重新遍历
解法二:滑动窗口(优化暴力枚举)
- 还是先定义left和right双指针,left先固定在起始位置,遍历right
- 当值等于1的时候,直接跳过,等于0的时候,zero计数器加一(进窗口)
- 当zero大于k的时候,就开始判断left位置的值,当值等于1 的时候,left++,zero不变,当值等于0的时候,left++,zero--(出窗口)
- 最后更新最大值结果
代码:
public int longestOnes(int[] nums, int k) {
int n = nums.length;
int left = 0;
int right = 0;
int zero = 0;
int Max = 0;
while(right < n){
//进窗口
if(nums[right] == 1){
right++;
}else{
zero++;
right++;
}
//判断
while(zero > k){
//出窗口
if(nums[left] == 1){
left++;
}else{
zero--;
left++;
}
}
//更新结果
Max = Math.max(Max,right - left );
}
return Max;
}
写法二:
public int longestOnes(int[] nums, int k) {
int ret = 0;
for(int left = 0, right = 0, zero = 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);
}
return ret;
}