解法一:暴力枚举
- 先定义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;}