1011. 在 D 天内送达包裹的能力
class Solution {
// 判断我们是否能在capacity内完成任务
// 因为是按照给定的顺序,所以只要用O(n)
public boolean possible(int[] weights, int D, int capacity){
int tmp = 0;
for(int i=0;i<weights.length;i++){
if(tmp + weights[i]>capacity){
// System.out.println("\n");
// System.out.print(weights[i]+"\t");
tmp = weights[i];
D -= 1;
}
else{
tmp += weights[i];
// System.out.print(weights[i]+"\t");
}
}
return (D>0);
}
public int shipWithinDays(int[] weights, int D) {
// 我们要搜索的范围一定在[最重的货物,所有货物的总重]之间
// 因为如果小于最重的货物,则一定无法运送最重的货物。
int l = -1;
int r = 0;
for(int i=0;i<weights.length;i++){
if(l<weights[i])
l = weights[i];
r += weights[i];
}
// 开始二分查找,因为最终的情况一定是[不行,不行....,不行,行,行....]中间有一个突变
while(l<r){
int mid = (l+r)/2;
if(possible(weights,D,mid))
r = mid;
else
l = mid+1;
}
return r;
}
}