分割数组的最大值
给定一个非负整数数组 nums 和一个整数 k ,你需要将这个数组分成 k 个非空的连续子数组。
设计一个算法使得这 k 个子数组各自和的最大值最小
思路:段数分的越多,最大值就越小,从不分段开始找,l为Math.max(mx-1, (sum-1)/k),r为sum。检验分段是否小于mid,小于r=mid。大于l=mid。
检验是否满足mid为前面的数字和sum不大于mid且段落数小于k。
class Solution {public int splitArray(int[] nums, int k) {int sum = 0;int mx = 0;for(int x:nums) {sum += x;mx = Math.max(mx, x);}int left = Math.max(mx-1, (sum-1)/k);int right = sum;while(left+1<right) {int mid = left + (right-left) / 2;if(check(nums, k, mid)) {right = mid;} else {left = mid;}}return right;}private boolean check(int[] nums, int k, int mx) {int cnt = 1;int s = 0;for(int x:nums) {if(s+x<=mx) {s +=x;} else {if(cnt == k) return false;cnt +=1;s = x;}}return true;}
}