- 首先这艘船的重量是固定的, 货物的运输顺序必须按照数组weights的顺序来, 不能打乱顺序. 那么我们可以想到这艘船最小的运载能力必须是所有货物中最重的那一件max(weights), 否则无法完成运输的任务. 这艘船最大的运载能力就是一次性把所有的货都搬走, 就是sum(weights). 所以答案就在区间[max(weights), sum(weights)]之间啦!
- 题目的考点最后落到二分搜索. 这里有一些明显的使用二分搜索的特征:答案区间已经有序;最优解在答案区间内
class Solution:
def shipWithinDays(self, weights: List[int], D: int) -> int:
# 最小的重量取数组最大的
left = max(weights)
# 最大的重量取数组的和
right = sum(weights)
while left < right:
mid = (left + right) // 2
day = self.check(mid, weights)
if day > D:
left = mid + 1
else:
right = mid
return left
def check(self, target, weights):
day = 1
cur_weight = 0
for weight in weights:
cur_weight = cur_weight + weight
if cur_weight > target:
cur_weight = weight
day = day + 1
return day