Given an array which consists of non-negative integers and an integer m, you can split the array into m non-empty continuous subarrays. Write an algorithm to minimize the largest sum among these msubarrays.
Note:
If n is the length of array, assume the following constraints are satisfied:
- 1 ≤ n ≤ 1000
- 1 ≤ m ≤ min(50, n)
Examples:
Input: nums = [7,2,5,10,8] m = 2 Output: 18 Explanation: There are four ways to split nums into two subarrays. The best way is to split it into [7,2,5] and [10,8], where the largest sum among the two subarrays is only 18.
参考资料:here。
class Solution {
private:
bool canSplit(vector<int>& nums, int sum, int m) {
int count = 1;
long tmp_sum = 0;
for (int num : nums) {
tmp_sum += num;
if (tmp_sum > sum) {
tmp_sum = num;
count++;
}
}
if (count <= m) return true;
else return false;
}
public:
int splitArray(vector<int>& nums, int m) {
int left = 0;
long right = 0;
for (int num : nums) {
left = max(num, left);
right += num;
}
while (left < right) {
int mid = (left + right) / 2;
if (canSplit(nums, mid, m)) right = mid;
else left = mid+1;
}
return right;
}
};