力扣解題思路 410 分割陣列的最大值

2021-10-11 21:40:38 字數 989 閱讀 4388

思路:

雖然第一反應是用動態規劃,可是想半天還是想不出動態方程,所以放棄了。。。

但是點開標籤發現可以採用二分法來解題,但是我們的陣列是無序的,所以如何確定二分法的思路呢?

我們可以首先採用貪心策略,先指定乙個中間數mid,我們將陣列不斷劃分成小於這個中間數的多個陣列,劃分方式使用貪心策略,也就是小於該數時不斷往裡放,直到滿了就開闢另乙個子陣列再往裡放。

由於此時我們並沒有指定劃分多少個,所以按照這種貪心策略可能劃分的陣列個數不等於題目要求的個數,如果我們劃分的個數過大,我們就可以提高mid(增大子陣列容量),相反如果我們劃分的個數過小,我們就可以減小mid。

那麼問題來了,如果我們劃分的個數剛好等於題目要求個數,這時是該直接返回答案嗎?當然不是!因為我們要求子陣列和最小,所以我們還需要再縮小mid !!!

完整**如下,細節見注釋:

public

intsplitarray

(int

nums,

int m)

//時間複雜度 o(nlogn)

while

(left < right)

temp += num;

}//最終需要再 +1 ,因為最後的乙個陣列在上面的迴圈中不會被新增

c++;//分割的子陣列個數比目標個數大,那麼意味著容量小的,需要調大容量

if(c > m)

else

}return

(int

)left;

//right

}

之前我不理解的點在於為什麼要返回left,因為我不確定left是否最終會收縮到最小和,後來我發現如果我們劃分的個數剛好等於題目要求個數,mid會左移直到剛剛好能等於某個子陣列和,所以最終left會收縮到和right一致,也就是會收縮到最終答案。

還有動態規劃法,之後再更新。。。

410 分割陣列的最大值

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

410 分割陣列的最大值

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

410 分割陣列的最大值

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