Split Array Largest Sum
2017-05-22 本文已影响29人
我叫胆小我喜欢小心
题目来源
给一个数组及一个整数m,求将数组分割成m块,使得这m块中最大的和最小。
我一开始没有理解好题目,以为是可以随机分成m组,但是实际上每个小组是连续的。
然后最小和肯定是位于最大元素和数组和之间的,然后进行二分,每次判断是否可以分成m组小于mid的,假如可以,那么mid还可以更小,假如不行,mid必须加大。
class Solution {
public:
int splitArray(vector<int>& nums, int m) {
int maxNum = 0;
long long sum = 0;
for (auto num : nums) {
sum += num;
maxNum = max(maxNum, num);
}
long long l = maxNum, r = sum;
while (l <= r) {
long long mid = (l + r) / 2;
if (valid(mid, nums, m))
r = mid - 1;
else
l = mid + 1;
}
return l;
}
bool valid(int target, vector<int>& nums, int m)
{
int count = 1;
long long total = 0;
for (auto num : nums) {
total += num;
if (total > target) {
total = num;
count++;
if (count > m)
return false;
}
}
return true;
}
};