leetcode 1014

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/little_white__/article/details/88628029

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

猜你喜欢

转载自blog.csdn.net/little_white__/article/details/88628029