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 解釋 一共有四種方法將...