經典題目 分割陣列的最大值 巧用二分法

2021-10-05 19:02:15 字數 1917 閱讀 3361

這道題有乙個很有意思的方法,就是二分方法。之所以能採用二分去思考的本質原因在於:具有單調最優的性質:如果最大值為 t 可以滿足條件劃分,那麼最大值為 t+1也可以,所以就直接二分最大值 t,找到最小滿足條件的 t 即可。

同樣是遵循單調性的,但是需要注意的我們需要維護乙個當前的最大值,因為我們是可以刪除這個最大值。

class

solution

:def

mintime

(self, time: list[

int]

, m:

int)

->

int:

left, right =0,

sum(time)

while left<=right:

mid = left+

(right-left)//2

if self.isvalid(time, m, mid)

: right = mid-

1else

: left = mid+

1return left

defisvalid

(self, time, m, bar)

: cur =

0 max_ = time[0]

for i in time[1:

]:if cur +

min(i, max_)

<=bar:

cur, max_ = cur+

min(i, max_)

,max

(i, max_)

else

: m -=

1if m ==0:

return

false

cur =

0 max_ = i

return

true

兩個函式isvalid有明顯的區別,這裡需要分辨清楚。因為對於第二種情況,是可能都刪除的。

分割陣列的最大值

題目 力扣 解題思路 動態規劃和二分查詢 具體可看 關於二分法,cnt為什麼初始化為1?這裡cnt初始化為1,是因為迴圈中當cnt 1的時候,首先預示著已經填滿了乙個子組,其次還預示著下一組已經有乙個數字加入了 即total num 所以最後一組在迴圈中一定不會被記入cnt就跳出了for迴圈,所以要...

LeetCode 分割陣列的最大值(二分搜尋)

給定乙個非負整數陣列和乙個整數 m,你需要將這個陣列分成 m 個非空的連續子陣列。設計乙個演算法使得這 m 個子陣列各自和的最大值最小。注意 陣列長度 n 滿足以下條件 1 n 1000 1 m min 50,n 示例 輸入 nums 7,2,5,10,8 m 2 輸出 18 解釋 一共有四種方法將...

410 分割陣列的最大值

給定乙個非負整數陣列和乙個整數 m,你需要將這個陣列分成 m 個非空的連續子陣列。設計乙個演算法使得這 m 個子陣列各自和的最大值最小。令dp i j 表示陣列前i個數分成j段時的最小和,那麼我們可以列舉k,表示前k個數分成了j 1段,那麼後k 1到i個數就被分成了一段,此時狀態轉移方程就是 sub...