解题思路
因为求的是满足条件的最小的运载量,所以所以针对某一运载量w,不应该存在一个小于w的数满足条件。且要能运输所有的货物,运载量的最低值应为货物单体的最大值(不可拆分货物),最大值为所有货物的总和。
设置l和r分别等于单个货物的最大值和货物重量总和,使用二分方法,每次对l和r的均值进行检测,如果w=mid时满足条件,则r=mid,否则l=mid+1;最后返回r的值。
代码
class Solution {
public int shipWithinDays(int[] weights, int D) {
int sum = 0;
int max = 0;
for(int i:weights)
{
max = Math.max(max, i);//获取单体最大值
sum += i;//获取总和
}
int l=max, r=sum;
while(l<r)
{
int mid = l+r >> 1;//每次使用均值进行检测
if(check(weights,mid,D))
{
r = mid;
}
else{
l=mid+1;
}
}
return r;//返回l和r都一样,因为while循环的出口是l=r
}
public boolean check(int [] weights , int w, int D)//检测每次运送w,需要运多少天
{
int c=0;
int i=1;
int cur_sum = weights[0];
while(i<weights.length)
{
while(i<weights.length && cur_sum + weights[i] <= w)
{
cur_sum += weights[i];
i++;
}
cur_sum=0;
c++;
}
return c<=D;//如果每次的运载量为w的话,需要的天数大于D,则证明不满足条件,则l=mid+1
}
}