本题源自 leetcode 410
---------------------------------------------------------------------------------
思路: 1 计算数组的和right,以及最大数left。则子数组的和就在left 和 right之间。然后用二分查找的方法,判断是否可以分为m个数组且和不大于sum。
代码:
bool canSplit(vector<int>& nums,int m,long long sum){
int count = 1;
long long s = 0;
for(int num : nums){
s += num;
if(s > sum){
count++; //统计分多少个数组,子数组和不大于sum
s = num;
}
}
return count <= m;
}
int splitArray(vector<int>& nums, int m) {
int n = nums.size();
long long left = 0;
long long right = 0;
for(int num : nums){
left = max(left,(long long)num);
right += num;
}
while(left <= right){
long long mid = (left + right) >> 1;
if(canSplit(nums,m,mid))
right = mid - 1;
else
left = mid + 1;
}
return left;
}