題目描述:
給定乙個由若干 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
方法1:雙指標,滑動視窗
主要思路:
(1)使用雙指標,乙個指向視窗的左側 left,乙個指向視窗的右側 right,初始值都為 0 ;
(2)先將右側指標盡量右移,知道不滿足條件,使用 right-left 獲得當前視窗的大小(中間一直保留最大視窗的大小),然後再將做側指標移動一位,判斷當前視窗的變換;
(3)對於第二步,具體的在移動右側指標時候,由於這裡規定了 k 次可以調換 0 為 1,故只要當前值為 1 ,或為0的時候,但k大於0,右側指標都可以向後移動,直到不滿足要求,既 當前值 為0 且 k為0了;
(4)對於第二步,具體的在移動左側指標的時候,若是當前值為 1,則只移動left,若是當前值為為0,則同時移動左側指標和右側指標,這裡相當於釋放出來乙個k值,讓右側指標可以越過當前的不能繼續移動的乙個位置;
class
solution
else
if(k>0)
else
} max_len=
max(max_len,right-left)
;//獲得當前視窗的大小,並更新可能的最大視窗
if(a[left]==1
)else
}return max_len;}}
;
1004 最大連續1的個數 III
自己的做法很麻煩並且時間複雜度高,最壞o n 2 o n 2 o n2 原因是沒有想到去數學推導,一步一步去想很費勁,應該改掉這個毛病。想到了二分的做法,但是寫麻煩了,首先統計了所有0塊所在的初始位置和個數,記為陣列a,然後遍歷所有的地方去填充0,這個時候就不能方便的從a中得到填充到哪為止,從而陷入...
1004 最大連續1的個數III
題目描述 給定乙個由若干 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,...
1004 最大連續1的個數 III
示例 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 ...