题目链接: https://leetcode-cn.com/problems/split-array-largest-sum/
题目: 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组。设计一个算法使得这 m 个子数组各自和的最大值最小。
思路: 想半天什么dp,其实就是个常见二分。首先确定答案肯定在avg(nums)到sum(nums)之间,确定上下界,然后二分逼近,对每一个mid值,看能不能分出满足题意的来
代码:
class Solution {
public int splitArray(int[] nums, int m) {
long down, up = 0, min_max_val = -1;
for(int val : nums){
up += val;
}
down = up / m;
while(down <= up){
long mid = (up + down) / 2;
if(check(nums, m, mid)){
min_max_val = mid;
up = mid - 1;
} else {
down = mid + 1;
}
}
return (int)min_max_val;
}
private boolean check(int[] nums, int m, long max_val){
long sum = 0, count = 1;
for(int val : nums){
sum += val;
if(sum > max_val){
sum = val;
count++;
}
if(sum > max_val || count > m){
return false;
}
}
return count <= m;
}
}