在 D 天内送达包裹的能力
传送带上的包裹必须在 D 天内从一个港口运送到另一个港口。
传送带上的第 i 个包裹的重量为 weights[i]。每一天,我们都会按给出重量的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。
返回能在 D 天内将传送带上的所有包裹送达的船的最低运载能力。
二分查找左边界
class Solution {
// 寻找左侧边界的二分查找
public int shipWithinDays(int[] weights, int D) {
int minWeight = Integer.MAX_VALUE;
int sumWeight = 0;
for(int w : weights) {
if(w < minWeight) {
minWeight = w;
}
sumWeight += w;
}
// 载重可能的最小值
int left = minWeight;
// 载重可能的最大值 + 1
int right = sumWeight + 1;
while(left < right) {
int mid = left + (right - left) / 2;
if(check(weights, D, mid)) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
// 如果载重为 w,是否能在 D 天内运完货物?
private boolean check(int[] weights, int D, int w) {
int i = 0;
for(int d = 1; d <= D; d++) {
int dayMaxWeight = w;
while((dayMaxWeight -= weights[i]) >= 0) {
i++;
if(i == weights.length) {
return true;
}
}
}
//在D天内无法运输完weights
return false;
}
}