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 * 104
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 官方题解:
1027. 最长等差数列225. 用队列实现栈
  • Utterance
灵檠
灵檠
一个普通的干饭人🍚
Announcement
🎉欢迎访问灵檠的博客!🎉
-- 感谢您的支持 ---
👏欢迎体验👏