leetcode410 分割陣列的最大值

2021-10-08 12:45:35 字數 1152 閱讀 8371

difficulty:困難

給定乙個非負整數陣列和乙個整數 m,你需要將這個陣列分成 m 個非空的連續子陣列。設計乙個演算法使得這 m 個子陣列各自和的最大值最小。

注意:

陣列長度 n 滿足以下條件:

示例:

輸入:

nums = [7,2,5,10,8]

m = 2

輸出:18

解釋:一共有四種方法將nums分割為2個子陣列。

其中最好的方式是將其分為[7,2,5] 和 [10,8],

因為此時這兩個子陣列各自的和的最大值為18,在所有情況中最小。

solution

這裡採用了二分法來解決問題。題目要求將陣列分為m組,然後目的是要每一組的和盡可能近似,最後輸出所有小組和的最大值(res)。為什麼可以想到二分法?因為這裡我們可以確定res的範圍,他必定在[max(nums),sum(nums)]這一區間中。根據這一區間,就可以對每個值一一試探:

取每個小組時,貪心地使小組和與mid最接近但不超過mid,保證mid是所有小組和的最大值(這裡mid可能並不是其中某個小組的和,但沒關係);

依照上述規則,假設取到了cnt個小組,若cnt>m,說明這個mid值設定小了,left=mid+1;否則,說明這個mid值滿足條件,但是mid仍有可能更小,right=mid;

最終left==right的時候,就必然是最終的各小組和的最大值,因為mid過小或者過大的情況都已經試過了。

下面是**。

class

solution

long left = nums[0]

, right = nums[0]

;//left為陣列中的最大值,right為整個陣列的和

for(

int i=

1; i)while

(left < right)

else

}//注意cnt這裡是少算了最後一組的,要+1

cnt++;if

(cnt > m)

else

}return

(int

)right;

}}

貪心 LeetCode410 分割陣列的最大值

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

LeetCode410 分割陣列的最大值

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

LeetCode 410 分割陣列的最大值

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