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 m subarrays.
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 = 2Output:
18
下面是用二分查找的方法。
class Solution {
public:
bool canSplit(vector<int>& nums, int m, long long sum) {
int c = 1;
long long s = 0;
for (auto& num : nums) {
s += num;
if (s > sum) {
s = num;
++c;
}
}
return c <= m;
}
int splitArray(vector<int>& nums, int m) {
long long left = 0, right = 0;
for (auto& num : nums) {
left = max(left, (long long)num);
right += num;
}
while (left <= right) {
long long mid = left + (right-left)/2;
if (canSplit(nums, m, mid))
right = mid-1;
else
left = mid+1;
}
return left;
}
};
本文介绍了一种使用二分查找算法解决将数组分成m个连续子数组并使这些子数组的最大和最小化的问题的方法。该算法首先确定了可能的解的空间范围,并通过迭代缩小这个范围来寻找最终解。
773

被折叠的 条评论
为什么被折叠?



