1004 最大連續1的個數 III

2021-10-07 23:14:45 字數 1205 閱讀 4709

題目描述:

給定乙個由若干 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 ...