一、题目
Given an integer array nums and an integer k, split nums into k non-empty subarrays such that the largest sum of any subarray is minimized.
Return the minimized largest sum of the split.
A subarray is a contiguous part of the array.
Example 1:
Input: nums = [7,2,5,10,8], k = 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.
Example 2:
Input: nums = [1,2,3,4,5], k = 2
Output: 9
Explanation: There are four ways to split nums into two subarrays.
The best way is to split it into [1,2,3] and [4,5], where the largest sum among the two subarrays is only 9.
Constraints:
1 <= nums.length <= 1000
0 <= nums[i] <= 106
1 <= k <= min(50, nums.length)
二、题解
答案可能的范围在0-sum之间,且具有单调性
class Solution {
public:
int splitArray(vector<int>& nums, int k) {
long long sum = 0;
for(int num:nums) sum += num;
long long l = 0,r = sum,res = 0;
while(l <= r){
long long mid = l + ((r - l) >> 1);
if(f(nums,mid) <= k){
r = mid - 1;
res = mid;
}
else l = mid + 1;
}
return res;
}
//使数组每一部分的累加和<=limit,最少需要划分成几个部分
int f(vector<int>& nums,long long limit){
//一次遍历
int count = 1;
long long sum = 0;
for(auto num:nums){
if(num > limit) return INT_MAX;
if(sum + num > limit){
count++;
sum = num;
}
else sum += num;
}
return count;
}
};