算法11.0
1004. 最大连续1的个数 III - 力扣(LeetCode)
翻转操作的麻烦:翻转成为1之后 之后迭代新的情况的话 需要变回0 这样很麻烦
拉下来? 这样空间复杂度就高了 翻转为1又同时又改回来?
如何不用翻转?
问题等价处理一下 只要满足某个区域内0的次数补药超过k就行
解法1:暴力枚举+zero计数器
暴力解法 枚举所有的子数组 固定一个起点 依次枚举终点
解法2:滑动窗口+规律
连续的三个零保证你right不会跑到后面 当我们知道这个信息之后 right不需要跑
left先越过去
敏锐的发现left和right同向移动 联想到使用滑动窗口解决问题(固定的那几步)
优化的逻辑
下面是效果图和代码:
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;}
}
//xiyu251016&1#2*3//对于循环的把控 直接条件就定义为了left=0 right往后面走 截至条件是right到数组最后
//无视的时候 是直接可以写代码的 用zero作为判断条件 大于zero的时候 直接就是出窗口了
//int ret 表示结果