//判断的依据就是在满足当前解(子数组和最大值,可以理解为当前准则)下分了几块,
//并和k比较,如果分块少了,说明可以再分,当前解还可以再小点(mid=right),让子数组再短些,反之亦然。
class Solution {
public:
bool solve(vector<int>&nums, int mid, int k){
int sum=0;
int cnt=1;
for(int i=0;i<nums.size();i++){
if(sum+nums[i]>mid){ //这个区间已经超过mid,要重新分一个段,cnt+1
cnt+=1;
sum=nums[i];
}else{
sum+=nums[i];
}
}
return cnt<=k;
}
int splitArray(vector<int>& nums, int k) {
int left=0, right=0;
//答案下界为每个数一组,即数组中最大值
//上界为只分一组,即数组之和
for(int i=0; i<nums.size();i++){
right+=nums[i];
left=max(left,nums[i]);
}
while(left<right){
int mid=(left+right)/2;
if(solve(nums, mid, k)){
right=mid;
}else{
left=mid+1;
}
}
return left;
}
};
leetcode410+Split Array Largest Sum+经典的最大最小问题,二分+贪心
最新推荐文章于 2024-06-22 21:53:36 发布