1011. 在 D 天内送达包裹的能力
在 D 天内送达包裹的能力
传送带上的包裹必须在 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
思路
这个问题可以用 二分查找 来解决,目标是找到能够满足在 days
天内完成运送的 船的最低运载能力。问题的关键是二分的对象是谁,二分的范围又是怎么样的?
一般来说,问的是什么,二分查找的对象就是什么,或者就是对应的数组的下标(以我之浅见)。再来考虑范围的问题。
1. 最小运载能力(包裹中的最大重量)
为什么最小运载能力要是包裹中的最大重量?
假设船的运载能力小于包裹中的最大重量,那么船就无法承载最大包裹。这样一来,无论是多大的船都无法运输这些包裹中的最大重量,因此,我们必须保证船的运载能力至少要大于等于包裹中最大单个包裹的重量。
举个例子:
- 假设有三个包裹,重量分别为 [1, 3, 5],如果船的最大运载能力为 4,那么船就无法运输重量为 5 的包裹,这样就不满足要求。
- 如果船的运载能力是 5,所有包裹就能被顺利运输。
因此,最小的船的运载能力应该是包裹中最大的一个包裹的重量。
2. 最大运载能力(所有包裹的总重量)
为什么最大运载能力是所有包裹的总重量?
如果船的运载能力等于所有包裹的总重量,那么我们可以把所有的包裹都装在船里,一天之内就完成了运送任务。这是一个极端的情况,船能够一次性运输所有的包裹,因此它的运载能力不需要大于总重量。
举个例子:
- 如果包裹的重量分别是 [1, 3, 5],那么总重量是 9。如果船的运载能力是 9,那么船可以一次性将所有包裹装下,在一天内完成运输。
因此,船的最大运载能力是所有包裹的总重量。
好,将上述思路整理清楚之后,我们开始整理完整的解题思路。
二分查找的思路
- 问题本质: 这个问题本质上是一个 最小化最大值 的问题。我们需要找到一个最小的船的运载能力,使得在
days
天内能够将所有包裹送完。 - 二分搜索的对象:
- 我们要二分搜索的是船的 运载能力,即每艘船在一天内能够装载的最大重量。运载能力的范围是从 包裹中的最大重量 到 所有包裹的总重量。
- 如何判断一个运载能力是否可行:
- 给定一个船的运载能力,我们可以模拟每天的装载过程,查看能否在 days 天内将所有包裹运送完。具体地:
- 按照顺序,逐个包裹装船。如果当前包裹的重量加上已经装载的重量不超过船的运载能力,则继续装载。如果超过了运载能力,则开始新的天数,重新装载包裹。
- 如果天数超过了
days
,则说明当前运载能力不够,需要增加。
- 给定一个船的运载能力,我们可以模拟每天的装载过程,查看能否在 days 天内将所有包裹运送完。具体地:
- 边界条件:
left
:二分查找的左边界是包裹中的最大重量,因为船的运载能力必须至少能够装载最大的包裹。right
:二分查找的右边界是所有包裹的总重量,因为船的运载能力不能超过总重量,否则一天就可以完成任务。
class Solution {
private boolean canShip(int[] weights, int capacity, int days){
int daysRequired = 1;
int currentWeight = 0;
for(int weight : weights){
//如果放入船上的重量超过运载能力,则新加一天
if(currentWeight + weight > capacity){
daysRequired++; // 增加一天
currentWeight = 0; // 重新开始新的一天
}
currentWeight += weight; // 当前船上放入包裹
}
return daysRequired <= days;
}
public int shipWithinDays(int[] weights, int days) {
int left = 0; //船的最小运载能力为包裹重量的最大值
int right = 0; //船的最大运载能力为包裹重量的总和
//计算最小和最大的运载能力
for(int weight : weights){
left = Math.max(left, weight);
right += weight;
}
while(left < right){
int mid = left + (right - left) / 2;
//如果运载能力mid可以完成任务,尝试更小的能力
if(canShip(weights, mid, days)){
right = mid; // 试图找到更小的运载能力
}else{
left = mid + 1; // 需要更大的运载能力
}
}
return left;
}
}
1011. 在 D 天内送达包裹的能力的更多相关文章
- Leetcode之二分法专题-1011. 在 D 天内送达包裹的能力(Capacity To Ship Packages Within D Days)
Leetcode之二分法专题-1011. 在 D 天内送达包裹的能力(Capacity To Ship Packages Within D Days) 传送带上的包裹必须在 D 天内从一个港口运送到另 ...
- 刷题-力扣-1011. 在 D 天内送达包裹的能力
1011. 在 D 天内送达包裹的能力 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/capacity-to-ship-packag ...
- Leetcode 1014. 在 D 天内送达包裹的能力
1014. 在 D 天内送达包裹的能力 显示英文描述 我的提交返回竞赛 用户通过次数197 用户尝试次数272 通过次数203 提交次数538 题目难度Medium 传送带上的包裹必须在 D 天 ...
- leetcode:在 D 天内送达包裹的能力
链接:https://leetcode-cn.com/problems/capacity-to-ship-packages-within-d-days/ 我是按照这个思路来做的. 如果随便给一个船的运 ...
- [Swift]LeetCode1011. 在 D 天内送达包裹的能力 | Capacity To Ship Packages Within D Days
A conveyor belt has packages that must be shipped from one port to another within D days. The i-th p ...
- 【JavaScript】Leetcode每日一题-在D天内送包裹的能力
[JavaScript]Leetcode每日一题-在D天内送包裹的能力 [题目描述] 传送带上的包裹必须在 D 天内从一个港口运送到另一个港口. 传送带上的第 i 个包裹的重量为 weights[i] ...
- Swift LeetCode 目录 | Catalog
请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift 说明:题目中含有$符号则为付费题目. 如 ...
- leedcode算法解题思路
1.两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个 ...
- 2019年7-8月Leetcode每日训练日志
2019-08-29 #274 H指数 2019-08-28 #287 寻找重复数 #875 爱吃香蕉的珂珂 #704 二分查找 2019-08-27 #744 寻找比目标字母大的最小字母 #225 ...
- 来自PTA Basic Level的三只小野兽
点我阅读原文 最近利用闲暇时间做了一下 PTA Basic Level[1] 里的题,里面现在一共有 95 道题,这些题大部分很基础,对于刷倦了 leetcode 的小伙伴可以去里面愉快的玩耍哦. 这 ...
随机推荐
- kubectl常用命令(一)
一.查看 1.查看集群状态 # 查看客户端及服务端程序版本信息 kubectl version --short=true
- JAVA 两个时间 相差的 小时,天数,分钟
long nd = 1000 * 24 * 60 * 60; //每天毫秒数 long nh = 1000 * 60 * 60; //每小时毫秒数 long nm = 1000 * 60; //每分钟 ...
- CommonsCollections3(基于ysoserial)
环境准备 JDK1.7(7u80).commons-collections(3.x 4.x均可这里使用3.2版本).javassist(3.12.1.GA) JDK:https://repo.huaw ...
- Java日志手机号脱敏工具类
背景 在开发过程中,很容易将用户敏感信息,例如手机号码.身份证等,打印在日志平台.为了保护用户数据,又不影响日志的打印,需要将日志中的敏感信息进行脱敏. 效果 没看明白,强烈建议 pull项目,执行一 ...
- 解决node报错ERR_OSSL_EVP_UNSUPPORTED
"scripts": {//修改启动dev方式 "dev": "SET NODE_OPTIONS=--openssl-legacy-provider ...
- moectf2023的一些题
[moectf]GUI 这是一道win32窗口程序 找到线程的回调函数 sub_740C94这个函数里有很多函数,意义不明,实际并不会对输入的字符串做出改变 回调函数里下断点,然后单步动调 sub_7 ...
- Winform跨线程访问报错问题解决
` using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; u ...
- Taro微信小程序获取Tab页可视区域高度
前情 公司有自己的小程序项目,因公司主要技术栈为react,所以选择了Taro来开发,Taro是京东出品的多端统一开发解决方案,用来开发小程序也相比用原生开发,在开发体验上好很多,而且还能使用成熟的R ...
- Fiddler对手机APP进行抓包
1.下载安装Fiddler 2.打开Fiddler菜单项Tools-> Options->HTTPS 勾选CaptureHTTPS CONNECTs,点击Actions, 勾选Decryp ...
- MongoDB备份脚本
#!/bin/bash #backup MongoDB #mongodump命令路径 DUMP=/home/mongodb/bin/mongodump #临时备份目录 OUT_DIR=/home/mo ...