题意:
原题链接
思路:
通常来说,求最小值的最大和最大值最小这种问题,基本思路都是二分答案。
二分答案,进行判断是否合法来更新二分区间即可。
这里 c h e c k check check函数贪心地选取子数组,我们会传入一个当前二分的答案 m a x max max,
只要我们的选取的连续子数组的和不超过 m a x max max,那么就可以贪心的累加,这样对后面的分组不会造成额外的和导致其超过 m a x max max。
代码:
class Solution {
public:
int splitArray(vector<int>& nums, int m) {
int n = nums.size();
auto check = [&](int mx) {
int i, j;
for(i = 0, j = 0; i < n; ++i) {
int sum = nums[i];
while(i + 1 < n && sum + nums[i + 1] <= mx) {
sum += nums[i + 1];
i += 1;
} j += 1;
//如果本轮过后已经分了超过m组,则就没必要继续分组了
if(j > m) return false;
}
return true;
};
int l = *max_element(nums.begin(), nums.end());
int r = accumulate(nums.begin(), nums.end(), 0);
while(l < r) {
int mid = l + r >> 1;
if(check(mid)) r = mid;
else l = mid + 1;
}
return l;
}
};