1. 程式人生 > 其它 >leetcode—1004. 最大連續1的個數 III

leetcode—1004. 最大連續1的個數 III

技術標籤:滑動視窗leecode

1004. 最大連續1的個數 III

難度中等

給定一個由若干01組成的陣列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;
       
    }
}