給定乙個由若干0
和1
組成的陣列a
,我們最多可以將k
個值從 0 變成 1 。
返回僅包含 1 的最長(連續)子陣列的長度。
重點:題意轉換。把「最多可以把 k 個 0 變成 1,求僅包含 1 的最長子陣列的長度」轉換為 「找出乙個最長的子陣列,該子陣列內最多允許有 k 個 0 」。
經過上面的題意轉換,我們可知本題是求最大連續子區間,可以使用滑動視窗方法。滑動視窗的限制條件是:視窗內最多有 k 個 0。
可以使用我多次分享的滑動視窗模板解決,模板在**之後。
**思路:
使用 left 和 right 兩個指標,分別指向滑動視窗的左右邊界。
right 主動右移:right 指標每次移動一步。當 a[right] 為 0,說明滑動視窗內增加了乙個 0;
left 被動右移:判斷此時視窗內 0 的個數,如果超過了 k,則 left 指標被迫右移,直至視窗內的 0 的個數小於等於 k 為止。
滑動視窗長度的最大值就是所求。
示例以 a= [1,1,1,0,0,0,1,1,1,1,0], k = 2 為例,下面的**演示了滑動視窗的兩個指標的移動情況。
package mainimport "fmt"
func slide_windows(num int, k int) (ans int)
sss := right - left + 1
ans = max(ans, sss)
} return
}func max(x, y int) int
return y
}func main()
k := 2
res := slide_windows(a, k)
fmt.println(res)
}
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,...