給定乙個由若干 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:子陣列(滑動視窗)雙指標:left 指標和 right 指標,開始時均指向陣列 a 的開頭。輸入: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 的個數,最多可以將 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,...