1011. 在 D 天内送达包裹的能力

在这里插入图片描述
在这里插入图片描述

  1. 首先这艘船的重量是固定的, 货物的运输顺序必须按照数组weights的顺序来, 不能打乱顺序. 那么我们可以想到这艘船最小的运载能力必须是所有货物中最重的那一件max(weights), 否则无法完成运输的任务. 这艘船最大的运载能力就是一次性把所有的货都搬走, 就是sum(weights). 所以答案就在区间[max(weights), sum(weights)]之间啦!
  2. 题目的考点最后落到二分搜索. 这里有一些明显的使用二分搜索的特征:答案区间已经有序;最优解在答案区间内
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

注意二分边界,等于不能直接返回

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值