1、题目描述
给定一个二进制数组 nums
和一个整数 k
,假设最多可以翻转 k
个 0
,则返回执行操作后 数组中连续 1
的最大个数 。
2、算法思路
不要去想题目中的应该怎么样反转0,我们应该是认为在一段连续区间中可以有0和1,但是0的个数不能超过k个就好了,因为是连续的区间,我们可以使用滑动窗口。
3、解题思路
常用套路,进窗口,判断,出窗口,更新结果
我们设左指针left和右指针right,其实就是下标。如果right此时指向是0元素,进窗口,如何判断区间目前0的个数,如果区间0的个数大于k个,那个left++,直到left一直走到0元素的位置,在更新结果。
4、算法代码
class Solution {
public int longestOnes(int[] nums, int k) {
int ret = 0,left=0,zero=0;
for (int right=0; right < nums.length; ++right) {
if (nums[right]==0) zero++; //进窗口,right下标指向的元素是0就zero++
while (zero > k){//判断,区间内的0的个数
if (nums[left] == 0) {//出窗口,left一直右移动直到找到下一个0原始
zero--;
}
left++;
}
ret = Math.max(ret,right-left+1);//更新结果,和上一次的最大值比较,那个大就选那个
}
return ret;
}
}