题目描述
给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数组中连续 1 的最大个数 。
示例 1:
1 2 3 4
   | 输入:nums = [1,1,1,0,0,0,1,1,1,1,0], K = 2 输出:6 解释:[1,1,1,0,0,1,1,1,1,1,1] 粗体数字从 0 翻转到 1,最长的子数组长度为 6。
 
  | 
 
解题思路
- 滑窗,数组中只有1和0,可以用做和的形式来表示,左指针移动的条件为right-left+1>sum+k
 
执行用时:4 ms, 在所有 Java 提交中击败了17.57%的用户
内存消耗:43.2 MB, 在所有 Java 提交中击败了20.81%的用户
通过测试用例:52 / 52
时间 O(N)
空间O(1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
   | class Solution {     public int longestOnes(int[] nums, int k) {         int sum=0,left=0,right=0,ans=0;         int n=nums.length;         while(right<n){             sum+=nums[right];             if(right-left+1<=sum+k){                 right++;             }             else{                 sum-=nums[left];                 left++;             }             ans=Math.max(ans,right-left);         }         return ans;     } }
 
  | 
 
- 精简一下,因为在一次左指针移动后,下次循环必定不会再进if,所以默认每次right++,减少循环次数
 
执行用时:3 ms, 在所有 Java 提交中击败了69.83%的用户
内存消耗:42.6 MB, 在所有 Java 提交中击败了91.21%的用户
通过测试用例:52 / 52
时间 O(N)
空间 O(1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
   | class Solution {     public int longestOnes(int[] nums, int k) {         int sum=0,left=0,right=0,ans=0;         int n=nums.length;         while(right<n){             sum+=nums[right];             if(right-left+1>sum+k){                 sum-=nums[left];                 left++;             }             right++;             ans=Math.max(ans,right-left);         }         return ans;     } }
 
  |