leetcode—1004. 最大連續1的個數 III
阿新 • • 發佈:2021-02-20
難度中等
給定一個由若干0
和1
組成的陣列A
,我們最多可以將K
個值從 0 變成 1 。
返回僅包含 1 的最長(連續)子陣列的長度。
示例 1:
輸入:A = [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]
示例 2:
輸入:A = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3
輸出:10
解釋:
[0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
覺得這是個滑動視窗的模板題,按照模板解,統計每個視窗0的個數:
class Solution { public int longestOnes(int[] nums, int k) { int n = nums.length; int res = 0; int cnt = 0; int left=0,right=0; while(right < n){ if(nums[right] == 0){ res++; } while(res > k){ res = 0;//下一個視窗中0的個數重置為0 left++; } cnt = Math.max(cnt, right-left+1); right++; } return cnt; } }
結果答案不對,因為我將下一個視窗中0的個數重置為0,重新統計0的個數。
沒有理解模板中的,“此時需要一直移動左指標,直至找到一個符合題意的區間”。
class Solution { public int longestOnes(int[] nums, int k) { int n = nums.length; int res = 0; int cnt = 0; int left=0,right=0; while(right < n){ if(nums[right] == 0){ res++; } while(res > k){ if(nums[left] == 0){ //這句是關鍵,此時需要一直移動左指標,直至找到下一個符合題意的區間。 res--; } left++; } cnt = Math.max(cnt, right-left+1); right++; } return cnt; } }