這道題有乙個很有意思的方法,就是二分方法。之所以能採用二分去思考的本質原因在於:具有單調最優的性質:如果最大值為 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...