1004 最大連續1的個數 III(滑動視窗)

2021-10-19 13:34:08 字數 1354 閱讀 9144

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

子陣列(滑動視窗)雙指標:left 指標和 right 指標,開始時均指向陣列 a 的開頭。

最大連續 1 的個數,最多可以將 k 個值從 0 變成 1 <==> 找到乙個長度最長的子陣列,並且子陣列中 0 的個數不超過 k。

判斷當前 right 指標指向的元素值是否是 0:若值為 1,則直接使 right 指標右移一位;若值為 0,則令 count (用來記錄當前子陣列**現的 0 的個數)的值加 1。

判斷 count 和 k 的大小:若 count > k,先要看 left 指標當前指向的元素值是否為 0 (這裡可以使用昨天使用的異或運算子 ^,這樣會減少程式執行的時間):若值為 0,則要使 count 的值減 1,然後再使 left 指標向右移動一位;若值為 1,則不需要修改 count 值,只需要將 left 指標右移一位,然後繼續執行第三步。若 count <= k,則不需要操作直接進行第三步即可。

比較當前視窗的大小與 maxlength (用來儲存符合條件的最長連續子陣列的長度的),然後 right 指標右移一位。

用 for 迴圈比用 while 迴圈更快一些。

class

solution

//因為是count++後接著進行判斷,所以可以用if

if(count > k)

maxlength = math.

max(maxlength, right - left +1)

;}return maxlength;

}}

時間複雜度:因為 a 陣列遍歷了一次且長度為 n,所以複雜度為o(n)

空間複雜度:因為沒有開闢新的空間,複雜度為o(1)

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

自己的做法很麻煩並且時間複雜度高,最壞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,...