核心:求最低运载能力,挨个试
优化:二分查找,查找的是左边界
框架:
int left=0;//取得到的第一个
int right=sum+1;//取不到的
while(left<right){
int mid=(left+right)/2;
if(canFinish()) right=mid;//缩小边界
else left=mid+1;
}
return left;
代码:
class Solution {
public:
int shipWithinDays(vector<int>& weights, int D) {
int sum=0;
for(int i=0;i<weights.size();i++){
sum+=weights[i];
}
int left=sum/D;
int right=sum+1;
while(left<right){
int mid=(left+right)/2;
if(CanFinish(mid,weights,D)) right=mid;//缩小边界
else left=mid+1;//寻找合适边界
}
return left;
}
bool CanFinish(int mid,vector<int>&weights ,int D){
int sum=1;//需要花费的天数
int cap=0;
for(int i=0;i<weights.size();i++){
if(mid<weights[i]) return false;
if(cap+weights[i]>mid){
cap=0;sum+=1;
}
cap+=weights[i];
}
return sum<=D;
}
};