题目描述:
解题思路:
因为存在一个ans比这个ans小的一定不能按照规定运送完货物,比ans大的一定能按照规定运送完,所以ans可以通过二分查找来确定。左边界和右边界分别是数组中最大值,和数组总和。
参考代码:
public int shipWithinDays(int[] weights, int D) {
int l=0,r=0;
for (int i = 0; i < weights.length; i++) {
l=Math.max(weights[i],l);
r+=weights[i];
}
//二分答案,左边界要保证不能将weights拆开,所以为weights的最大值,保证每一次至少能将一次的货物运送走。
//右边界就是一次全部运送完,也就是weights的总值
while(l<r){
int mid=l+r>>1;
if(check(mid,weights,D)){
r=mid;
}else {
l=mid+1;
}
}
return r;
}
//检查当前mid下D次能否送完所有的weights
private boolean check(int mid, int[] weights, int D) {
int sum=0;
int count=0;
for (int i = 0; i < weights.length; i++) {
sum+=weights[i];
if(sum>mid){
i--;
sum=0;
count++;
if(count>D) return false;
}
}
//当最后一次没有超过mid的时候,但还是需要一次
if(sum!=0) count++;
return count<=D;
}