版权声明:本文为博主原创文章,未经博主允许不得转载。 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,与最大的承载量的目标需要转换一下.首先承载量越大,需要的天数越少.
- 天数如果大于D,说明承载量少了,小于目标值,到左半区寻找;
- 天数如果等于D,但是需要找等于D但是要承载量少的值,到左半区找;
- 天数如果大于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