这里有leetcode题集分类整理!!!![在这里插入图片描述](https://img-blog.csdnimg.cn/20210426064347534.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2U5MzUwNTIzMTk=,size_16,color_FFFFFF,t_70)
官方AC:
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) / 2;
// need 为需要运送的天数
// cur 为当前这一天已经运送的包裹重量之和
int need = 1, cur = 0;
for (int weight : weights) {
if (cur + weight > mid) {
++need;
cur = 0;
}
cur += weight;
}
if (need <= D) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/capacity-to-ship-packages-within-d-days/solution/zai-d-tian-nei-song-da-bao-guo-de-neng-l-ntml/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
fast speed: (5ms)
class Solution {
public int shipWithinDays(int[] weights, int D) {
// 载重范围,最小应该是货物中最大重量(否则就没办法装船了)
int left = 0;
for (int weight : weights) {
if (weight > left) {
left = weight;
}
}
// 最大应该是假设每个货物都为最大,平均每天能带多少
// 注:当D > weights.length 时, right < left 即 此时会直接返回 left。而背后的逻辑是,当天数大于货物数量,那么只要每天至少搬一个货物上船即可,此时可以达到区间的最小,即货物的最大重量
int right = left * weights.length / D + 1;
// 取值区间使用左右闭合
while (left <= right) {
int mid = (left + right) >>> 1;
if (canFinish(weights, D, mid)) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return left;
}
private boolean canFinish(int[] weights, int D, int cap) {
int day = 1, cur = cap;
for (int weight : weights) {
if (weight > cur) {
day++;
cur = cap;
}
cur -= weight;
}
return day <= D;
}
}