1011. 在 D 天内送达包裹的能力
题目描述
传送带上的包裹必须在 \(days\) 天内从一个港口运送到另一个港口。
传送带上的第 \(i\) 个包裹的重量为 \(weights[i]\)。每一天,我们都会按给出重量(\(weights\))的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。
返回能在 \(days\) 天内将传送带上的所有包裹送达的船的最低运载能力。
示例 1:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
示例 2:
1 2 3 4 5 6 7 |
|
示例 3:
1 2 3 4 5 6 7 |
|
提示:
- \(1 \le days \le weights.length \le 5 * 10^4\)
- \(1 \le weights[i] \le 500\)
算法与思路
我们考虑假设船的货运能力为 \(x\) 时,我们可以在 \(days\) 天内运送完所有的包裹,那么只要货运能力大于 \(x\),我们同样可以在 \(days\) 天内运送完所有的包裹:只需要按照货运能力为 \(x\) 时的运送方法即可。
于是,我们可以得到以下结论:
存在一个运载能力下限,记为 \(x_{ans}\),使得当 \(x \ge x_{ans}\) 时,我们可以在 \(days\) 天内运送完所有包裹;当 \(x < x_{ans}\) 时,我们无法在 \(days\) 天运送完所有包裹。
这是一个二段性的结论,即存在一个值,其左右两边,结果不同。
对于具有二段性性质的题目,我们可以使用二分查找算法,来找出目标值。
如何判断当前二分查找到的值是否满足我们所需要的条件?
- 如果当前值 \(target\) 小于单个包裹的重量时,返回 \(false\);
- 设置两个累加器 \(cnt,t\),分别代表当前值所需天数和某天的货运重量,当某天货运总量\(t + weights[i] > target\) 时,清空 \(t\),\(cnt+=1\);
- 最后返回 \(cnt \le days\) 的结果
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|