思路:二分法,这里是对所求的包裹重量D进行二分,初始时,D的最低重量left要取数组中最大的值,这样能保证即使一个一个运也能运走全部包裹,D的最大重量right要取数组总和,这样一次性就能运走全部包裹。然后开始二分:在left<right大前提下,取中值,来计算中值所需要的天数,如果天数超过了目标天数,说明所运的重量太小,则left变成mid+1;若天数不大于目标天数,说明所运的的重量过大或正好,则让right=mid即可,最终left为取得的最小满足条件的重量。
class Solution {
public:
int shipWithinDays(vector<int>& weights, int D) {
int left=0;
for(auto x:weights)
if(x>left)
left=x;
int right=accumulate(weights.begin(),weights.end(),0);
while(left<right)
{
int mid=(left+right)/2;
int day=0,w=0;
for(auto i:weights)
{
if((i+w)>mid)
{
++day;
w=0;
}
w+=i;
}
if(day<D)
right=mid;
else
left=mid+1;
}
return left;
}
};