給定一個二進制數組,你可以最多將 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兩種,所以雙指針滑動窗口非常好處理。如果是任意的字母呢,這個時候還能用雙指針處理嗎?