1011. 在 D 天内送达包裹的能力
1011. 在 D 天内送达包裹的能力
题目链接:1011. 在 D 天内送达包裹的能力
题目描述
传送带上的包裹必须在 days 天内从一个港口运送到另一个港口。
传送带上的第 i 个包裹的重量为 weights[i]。每一天,我们都会按给出重量(weights)的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。
返回能在 days 天内将传送带上的所有包裹送达的船的最低运载能力。
核心思考:对能力值域进行二分查找
这道题在结构和思想上与 875. 爱吃香蕉的珂珂 十分相似。遇到这类限制天数或时间,求最小能力的题目,解题的关键在于明确以下三个核心要素:
- 可变变量(搜索对象):船的运载能力。
- 评价指标(约束条件):在给定运载能力下,搬运完所有货物所需的总天数。
- 单调区间:运载能力越大,所需的天数越少。这构成了单调递减的关系,满足使用二分查找的前提。
确定二分查找边界
在进行二分查找前,我们需要确定运载能力的合理上下界:
- 最小运载能力(左边界
left):由于包裹不能拆分运送,船的运载能力至少要能装下最重的那一个包裹。因此,左边界为max(weights)。 - 最大运载能力(右边界
right):最理想的情况是一次性将所有包裹全部运走。因此,右边界为所有包裹重量的总和sum(weights)。
查找逻辑
在明确了 [max(weights), sum(weights)] 这个闭区间后,我们就可以通过二分查找不断测试当前的运载能力 mid:
- 若在运载能力为
mid的情况下,所需天数curr_days大于规定的days,说明当前能力不足,必须提高运载能力,将左边界更新为left = mid + 1。 - 若所需天数
curr_days小于或等于规定的days,说明运载能力足够,但可能存在更小的满足条件的值。为了寻找“最低运载能力”,需要向左收缩查找区间,将右边界更新为right = mid - 1。
当循环结束时,left 指针所在的数值即为满足条件的最低运载能力。
解题思路 (Python)
1 | class Solution: |

复杂度分析
- 时间复杂度:$O(N \log(\Sigma W))$,其中 $N$ 是数组
weights的长度,$\Sigma W$ 是数组中所有重量的总和。找出左右边界需要 $O(N)$ 的时间。二分查找的区间大小为 $\Sigma W$,最多进行 $O(\log(\Sigma W))$ 次迭代。在每一次查找中,调用curr_power函数需要遍历一次数组,耗时 $O(N)$。因此总时间复杂度为外层迭代次数与内层遍历的时间之积。 - 空间复杂度:$O(1)$。代码只使用了几个整型变量来记录边界和状态参数,并未分配与输入数据规模挂钩的额外空间。