题目描述 【中等】
传送带上的包裹必须在
D
天内从一个港口运送到另一个港口。传送带上的第
i
个包裹的重量为weights[i]
。每一天,我们都会按给出重量的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。返回能在
D
天内将传送带上的所有包裹送达的船的最低运载能力。
示例 1:
输入:
weights = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
,D = 5
输出:15
解释: 船舶最低载重15
就能够在5
天内送达所有包裹,如下所示:
第1
天:1, 2, 3, 4, 5
第2
天:6, 7
第3
天:8
第4
天:9
第5
天:10
请注意,货物必须按照给定的顺序装运,因此使用载重能力为
14
的船舶并将包装分成(2, 3, 4, 5)
,(1, 6, 7)
,(8)
,(9)
,(10)
是不允许的。
示例 2:
输入:
weights = [3, 2, 2, 4, 1, 4]
,D = 3
输出:6
解释: 船舶最低载重6
就能够在3
天内送达所有包裹,如下所示:
第1
天:3, 2
第2
天:2, 4
第3
天:1, 4
示例 3:
输入:weights = [1, 2, 3, 1, 1]
,D = 4
输出:3
解释:
第1
天:1
第2
天:2
第3
天:3
第4
天:1, 1
提示:
1 <= D <= weights.length <= 5 * 10 ^ 4
1 <= weights[i] <= 500
题目地址:地址
正式分析
首先根据题目描述,我们发现运送货船的 载重区间
范围在 [货物中最小重量, 所有货物重量和]
之间,而如何求出在 D
天内船舶最低的载重,则需要做类似于 [20210509]LeetCode每日一题 - 1482. 制作 m 束花所需的最少天数 题一样的 二分法
去找到这个最适合的值
具体代码
function shipWithinDays(weights: number[], D: number): number {
let min = Math.max(...weights)
let max = weights.reduce((prev, curr) => prev + curr, 0)
while (min < max) {
const mid = Math.floor((max - min) / 2) + min
if (canTransport(weights, D, mid)) {
max = mid
} else {
min = mid + 1
}
}
return min
};
function canTransport(weights: number[], D: number, mid: number): boolean {
let transportDay = 0
const length = weights.length
for (let i = 0, sum = 0; i < length; sum = 0, transportDay++) {
for (; i < length && sum + weights[i] <= mid; i++) {
sum += weights[i]
}
}
return transportDay <= D
}
TS AC,执行用时:104 ms
, 在所有 TypeScript
提交中击败了 97%
的用户
最后
如果我在哪里写的有问题,欢迎指出,共同进步,谢谢阅读~