二分查找的思路,它最终的结果 肯定在最大值与 所有值的和之间, 做二分查找比较可得所有满足的值,然后求出最小的值即为结果。
代码如下:
class Solution {
public:
int shipWithinDays(vector<int>& weights, int D) {
int size=weights.size();
int res;//用来存放结果,每次最小值来更换
int left=0,right=0;
//left是最大值,right是所有的和,所求的结果肯定在[left,right]
for(int i=0;i<size;i++){
right+=weights[i];
left=max(left,weights[i]);
}
res=right;//先取最大值
//二分查找找寻合适的值
while(left<=right){
int mid=(left+right)>>1;//中间值
int day=0;//记录当前的天数
int temp=0;//用来判断目前的承重,来与mid比较是否超重
for(int i=0;i<size;i++){
temp+=weights[i];
//当到某个包裹大于运载能力,之前的包裹记为一天
//这个包裹开始记为第二天
if(temp>mid){
day++;
temp=weights[i];
}
}
day++;//剩下的包裹再记一天
//运载能力不够,右半边寻找
if(day>D){
left=mid+1;
}
//运载能力过剩,左半边寻找
if(day<=D){
right=mid-1;
res=min(res,mid);//在所有符合结果的数组中找到最小的那个值即为结果
}
}
return res;
}
};