Leetcode 487. 最大連續1的個數ⅡⅢ(雙指針滑動窗口)

給定一個二進制數組,你可以最多將 1 個 0 翻轉爲 1,找出其中最大連續 1 的個數。

示例 1:

輸入:[1,0,1,1,0]
輸出:4
解釋:翻轉第一個 0 可以得到最長的連續 1。
     當翻轉以後,最大連續 1 的個數爲 4。
 

注:

輸入數組只包含 0 和 1.
輸入數組的長度爲正整數,且不超過 10,000

 

雙指針維護一個窗口,窗口中至多出現一個0
 

class Solution {
    public int findMaxConsecutiveOnes(int[] nums) {
        int res=0, count=0;
        for(int i=0,j=0;j<nums.length;j++){
            if(nums[j]==0){
                count++;
                while(count>1){
                    if(nums[i]==0) count--;
                    i++;
                }
            }
            res = Math.max(res,j-i+1);
        }
        return res;
    }
}

給定一個由若干 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]
粗體數字從 0 翻轉到 1,最長的子數組長度爲 6。
示例 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 翻轉到 1,最長的子數組長度爲 10。
 

提示:

1 <= A.length <= 20000
0 <= K <= A.length
A[i] 爲 0 或 1 

 

雙指針維護一個窗口,窗口中至多出現k個0

class Solution {
    public int longestOnes(int[] nums, int k) {
        int count = 0, res = 0;
        for(int i=0,j=0;j<nums.length;j++){
            if(nums[j]==0) count++;
            while(count>k){
                if(nums[i]==0) count--;
                i++;
            }
            res = Math.max(res,j-i+1); 
        } 
        return res;
    }
}

 

由於這到題目數組只有0和1兩種,所以雙指針滑動窗口非常好處理。如果是任意的字母呢,這個時候還能用雙指針處理嗎?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章