leetcode
leetcode 901 ~ 950
在 D 天内送达包裹的能力

在 D 天内送达包裹的能力

难度:

标签:

题目描述

代码结果

运行时间: 111 ms, 内存: 20.4 MB


/*
题目思路:
1. 使用流的方式来计算最大运载能力和总重量。
2. 其余逻辑与Java的解法相同。
*/
import java.util.Arrays;

public class Solution {
    public int shipWithinDays(int[] weights, int days) {
        int left = Arrays.stream(weights).max().getAsInt();
        int right = Arrays.stream(weights).sum();
        while (left < right) {
            int mid = (left + right) / 2;
            if (canShip(weights, days, mid)) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        return left;
    }

    private boolean canShip(int[] weights, int days, int capacity) {
        int currentLoad = 0;
        int requiredDays = 1;
        for (int w : weights) {
            if (currentLoad + w > capacity) {
                requiredDays++;
                currentLoad = 0;
            }
            currentLoad += w;
        }
        return requiredDays <= days;
    }
}

解释

方法:

该题解采用二分查找法确定最小的运载能力。首先设置二分查找的范围:下界 l 是 weights 中的最大值(因为载重至少要能承载单个包裹中的最大重量),上界 r 是按最大包裹权重均匀分布时的总重量。然后定义一个辅助函数 check(cap),用于判断给定的载重 cap 是否能在指定的 days 天内运送完所有包裹。具体方法是顺序累加包裹重量,当累加的重量超过 cap 时,需要使用新的一天继续装载,如果使用的天数超过 days,则返回 False。通过二分查找逐渐缩小可能的载重范围,直到找到最小的符合条件的载重。

时间复杂度:

O(n log(R-L))

空间复杂度:

O(1)

代码细节讲解

🦆
为什么在二分查找中下界设置为weights数组中的最大值?
在此问题中,下界设置为weights数组中的最大值是因为任何有效的运载能力至少应该能够承载单个包裹的最大重量。如果运载能力小于weights中的最大值,那么至少有一个包裹无法被运载,因此这样的载重能力不符合问题的基本需求。设置下界为weights中的最大值是为了确保所有包裹都可以被单独运载,从而满足基本的逻辑要求。
🦆
在二分查找中,当check函数返回False时,为什么选择增加mid值(即设置l = m + 1)?
当check函数返回False时,说明当前的运载能力cap(即mid值)不足以在指定的天数内完成所有包裹的运送。因此,需要尝试一个更大的运载能力来满足条件。通过设置l = m + 1,我们排除了当前和更小的运载能力值,将搜索范围向可能成功的更大值方向调整。这是二分搜索策略的一部分,旨在逐步缩小搜索范围,直至找到最小的满足条件的运载能力。
🦆
check函数在处理完所有weights后直接返回True是否考虑了所有边界情况,例如当最后一天刚好达到或略低于最大载重时的情况?
check函数在处理完所有weights后直接返回True实际上已经考虑了所有边界情况。函数逻辑确保在不超过指定天数的情况下,每一天的累积载重都不会超过cap。只要最后一天的累积载重没有超过cap,无论是刚好达到还是略低于最大载重,都表明这个cap值是足够的。此函数保证了在给定的天数内,所有包裹都可以被运送完毕,因此可以直接返回True。
🦆
在实际应用中,如何确定weights数组中单个包裹的最大重量不会超过船的最大承载能力?
在实际应用中,通常会通过事先的设备选择和规划来确保船只的最大承载能力至少等于或大于预计中单个包裹的最大重量。这通常涉及到对船只的承载标准的了解和包裹重量的预估。在运输前的准备阶段,会有明确的规定或者检查,以确保每个包裹的重量都在船只的承载能力范围内。如果存在任何包裹超过船只最大承载能力的风险,那么需要重新评估包裹的分配或者选择更大承载能力的船只。

相关问题