记录 1 道算法题
在D天内送达包裹的能力
1011. 在 D 天内送达包裹的能力 - 力扣(LeetCode)
要求:按顺序搬运数组里面的货物,规定在 days 天内搬完,求能够搬完的最低单次搬运量。比如: weights:[1,2,3,4,5,6,7,8,9,10]
days:5,输出:15。
首先我们可以确定最低的搬运量不会小于数组里最大的数,也不会超过数组元素的和。所以我们可以先划定一个边界。然后使用二分移动左右边界。
二分的判断条件是假如按照当前的搬运量,需要使用的天数和 days 相比。满足条件的天数是小于等于 days 的全部天数。我们求最小的搬运量,所以可以直接用符合条件的左边界的值。也是天数尽可能大。
完整代码如下:
function shipWithinDays(weights, days) {
// 左右边界
let l = Math.max(...weights)
let r = weights.reduce((a,b) => a + b, 0)
// 边界不重叠,重叠了容易进入死循环,因为右边界有重复
while (l < r) {
const mid = (l + r) >> 1
// 搬运量
let fleet = 0
// 天数
let count = 1
// 如果当前搬运量已经超过最低搬运量,则留到下一天
if (fleet + weight <= mid) {
fleet += weight
} else {
count++
fleet = weight
}
// 移动边界
if (count <= days) {
r = mid
} else {
l = mid + 1
}
}
return l
}