[路飞]在D天内送达包裹的能力

40 阅读1分钟

记录 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
    }