题目
链接:https://leetcode-cn.com/problems/capacity-to-ship-packages-within-d-days
传送带上的包裹必须在 D 天内从一个港口运送到另一个港口。
传送带上的第 i 个包裹的重量为 weights[i]。每一天,我们都会按给出重量的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。
返回能在 D 天内将传送带上的所有包裹送达的船的最低运载能力。
二分查找
承载量的最小值: 货物的最大重量,否则不能装
承载量的最小值: 所有货物的重量之和
class Solution {
public int shipWithinDays(int[] weights, int D) {
int left = Arrays.stream(weights).max().getAsInt(), right = Arrays.stream(weights).sum();
while (left < right) {
int mid = left + (right - left) / 2;
if (canfinish(weights, mid, D)) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
private boolean canfinish(int[] weights, int cap, int D) {
int i = 0;
for (int day = 0; day < D; day++) {
int maxCap = cap;
while (maxCap >= weights[i]) {
maxCap -= weights[i];
i++;
if (i == weights.length)
return true;
}
}
return false;
}
}