type
status
date
slug
summary
tags
category
icon
password
LeetCode上的一道中等难度题,在专项训练二分查找时录入。
📝 题目
传送带上的包裹必须在
days
天内从一个港口运送到另一个港口。传送带上的第
i
个包裹的重量为 weights[i]
。每一天,我们都会按给出重量(weights
)的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。返回能在
days
天内将传送带上的所有包裹送达的船的最低运载能力。示例 1:
输入:weights = [1,2,3,4,5,6,7,8,9,10], days = 5 输出:15 解释: 船舶最低载重 15 就能够在 5 天内送达所有包裹,如下所示: 第 1 天:1, 2, 3, 4, 5 第 2 天:6, 7 第 3 天:8 第 4 天:9 第 5 天:10 请注意,货物必须按照给定的顺序装运,因此使用载重能力为 14 的船舶并将包装分成 (2, 3, 4, 5), (1, 6, 7), (8), (9), (10) 是不允许的。
示例 2:
输入:weights = [3,2,2,4,1,4], days = 3 输出:6 解释: 船舶最低载重 6 就能够在 3 天内送达所有包裹,如下所示: 第 1 天:3, 2 第 2 天:2, 4 第 3 天:1, 4
示例 3:
输入:weights = [1,2,3,1,1], days = 4 输出:3 解释: 第 1 天:1 第 2 天:2 第 3 天:3 第 4 天:1, 1
提示:
1 <= days <= weights.length <= 5 * 10
4
1 <= weights[i] <= 500
🤗 题解
直接使用二分查找,查找船的运载能力。
其中右区间便所有货物的重量和,左区间比较讲究,由于船每次运送的重量不能小于货物的重量,于是我们直接使用货物的最大重量作为左区间(因为不可能再比这个重量更小了)。
接着便是区间移动问题,当中间数
m
所指代的重量不够时,很显然左区间应当等于m+1
;当
m
所指代的重量够的时候,右区间有两种选择:- 保留这个数,即有可能答案就是这个
m
,将右区间移到这个位置,right=m
,但是此时外部循环结束条件就是left=right
的时候,即我们所要的答案已经找到了,否则会出现无限循环
- 不保留这个数,
right
指向m
左边一位,表示right
目标指向最后一个不符合条件的那个数,最终结果left
一定在right
右边一位,即刚好为我们所有求的第一个符合条件的那个数。
std::max_element(): ForwardIt max_element( ForwardIt first, ForwardIt last );用于计算左右迭代器地址区间内的最大值的地址。
头文件<numeric> accumulate(InputIterator first, InputIterator last, Type init);用于求左右迭代器地址区间内,以init
为初始值求和。
📎 参考文章
- c++ STL文档:
- c++ 文档:
- LeetCode 官方题解:
- Author:灵檠
- URL:https://blog.ly-qing.lol/article/d89d11ea-0f18-41d1-939a-13f97ba804af
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!