leetcode 1014

博客围绕LeetCode题目展开,题目要求将数组分成连续的D块,使每块和小于等于res,求最小的res值。给出样例及解释,解题思路是运用二分思想,res最大值为数组和,最小值为数组最大值,通过二分查找变形来求解,还给出二分法变形参考链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值