算法原理:
这道题大眼一看是关于翻转多少个0的问题,但是,如果你按照这种思维去做题,肯定不容易。所以我们要换一种思维去做,这种思维不是一下就能想到的,所以想不到也情有可原。
题目是:给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数组中连续 1 的最大个数 。
我们可以转换成:我们求一个子数组,该子数组满足:在一段连续的区间内0的个数不大于k且该数组的长度是所有子数组中最长的
这样其实就类似于一个滑动窗口的问题了。
如果还没有看明白,没关系。详细解释一下:对比以前的滑动窗口,以前的判断条件是求某一段的和最大/求某一段含有不重复的字符最多……,只不过这次的判断条件是0的个数不能超过k,由于这个条件对我们子区间内还要进行操作,所以可能会使你下不去手,困惑。
但是只要抓住本质,按照那个模版来就能写对,这还需要平时多练。
暴力解法就不展示了,就是两个for循环枚举。
代码实现
class Solution {
//滑动窗口:
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;
}
}