leetcode 1014

题目链接:https://leetcode-cn.com/contest/weekly-contest-128/problems/capacity-to-ship-packages-within-d-days/

题目意思:给一个数组W和一个数D,要求把这个数组分成连续的D块,使每块的和小于等于res,求最小的res值.

样例:
输入:weights = [3,2,2,4,1,4], D = 3
输出:6
解释:
船舶最低载重 6 就能够在 3 天内送达所有包裹,如下所示:
第 1 天:3, 2
第 2 天:2, 4
第 3 天:1, 4

思路:
用二分的思想,res最大值是sum(weight),res最小值是max(weight),然后求满足条件的最小的res,也就是寻找最小的小于等于目标值的二分查找.

这里的目标值D,与最大的承载量的目标需要转换一下.首先承载量越大,需要的天数越少.

  1. 天数如果大于D,说明承载量少了,小于目标值,到左半区寻找;
  2. 天数如果等于D,但是需要找等于D但是要承载量少的值,到左半区找;
  3. 天数如果大于D,说明承载量大了,大于目标值,到右半区找.
class Solution:
    def shipWithinDays(self, weights: List[int], D: int) -> int:
        #c开头的都是承载量
        cmax = sum(weights)
        cmin = max(weights)
        
        while(cmin <= cmax):
            day = 1
            cmid = (cmin + cmax) // 2
            
            wtemp = 0
            for w in weights:
                if w + wtemp <= cmid:
                    wtemp += w
                else:
                    wtemp = w
                    day += 1
           
            if day > D:
                cmin = cmid + 1
            elif day <= D:
                cmax = cmid - 1

        return cmin

小结:
主要用到了二分法的变形.关于二分法的变形可以参考https://www.cnblogs.com/luoxn28/p/5767571.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值