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 = 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.
将数组nums分为m个个连续子数组,尽量减小每一个子数组的和,返回最大的子数组和
思路:二分法,每一个假设一个可能的答案,然后验证答案是否可能,返回最大的可能的答案
class Solution {
public int splitArray(int[] nums, int m) {
long sum = 0;
for(int num : nums)
sum += num;
long left = sum / m - 1, right = sum;
while(left < right){
long mid = left + (right - left) / 2;
if(judge(nums, mid, m))
right = mid;
else
left = mid + 1;
}
if(judge(nums, left, m))
return (int)left;
return (int)left - 1;
}
public boolean judge(int[] nums, long target, int m){
long sum = 0;
int ct = 0;
for(int i = 0; i < nums.length; i++){
if(nums[i] > target)
return false;
if(sum + nums[i] > target){
sum = 0;
ct++;
}
sum += nums[i];
}
ct += sum == 0 ? 0 : 1;
return ct <= m;
}
}