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 的小伙伴可以去里面愉快的玩耍哦. 这 ...
随机推荐
- 2.12 Linux两种远程管理工具(PuTTY和SecureCRT)
通过<Linux远程管理协议>一节可以知道,Linux远程管理服务器多基于 SSH 协议.本节给大家介绍 2 种常见的基于 SSH 协议的远程管理工具,分别是 PuTTY 和 Secure ...
- Linux日志轮替与总结
目录 基本介绍 轮替文件的命名 配置文件 路径位置 参数说明 举例:把自己的日志加入日志轮替 说明 步骤 日志轮替机制原理[个人理解,仅供参考] 总结[关于日志需要掌握的点] 基本介绍 日志轮替就是把 ...
- Linux Shell综合:备份数据库
需求分析 每天凌晨2:30备份数据库hspedu到/data/backup/db 备份开始和备份结束能够给出相应的提示信息 备份后的文件要求以备份时间为文件名,并打包成.tar.gz的形式,比如:20 ...
- 基于Java+SpringBoot心理测评心理测试系统功能实现三
一.前言介绍: 1.1 项目摘要 心理测评和心理测试系统在当代社会中扮演着越来越重要的角色.随着心理健康问题日益受到重视,心理测评和心理测试系统作为评估个体心理状态.诊断心理问题.制定心理治疗方案的工 ...
- NOIP2023模拟9联测30 T4 金牌
NOIP2023模拟9联测30 T4 金牌 LCA 还能 \(O(1)\)-- 思路 思路非常简单,可考试就是想歪成统计指数了-- 将一条穿过 \((x,y)\) 的路径 \((u,v)\) 分为 \ ...
- cmu15545笔记-查询优化(Query Optimization)
目录 概述 Heuristics / Rules Cost-based Search Single relation Mutiple relation Genertive / Bottom-Up Tr ...
- flask 中的request【转载】
每个框架中都有处理请求的机制(request),但是每个框架的处理方式和机制是不同的,为了了解flask的request中都有什么东西,首先我们要写一个前后端的交互 基于HTML+Flask 写一段前 ...
- Linux系统之Ubuntu
常用命令: #查看安装包 dpkg -l 1)切换镜像源 本身的镜像都是国外的,下载依赖包太慢, 需要替换成国内镜像地址 国内镜像源推荐阿里 OPSX 源: https://opsx.alibaba. ...
- nginx配置之Gzip压缩
Nginx开启Gzip压缩功能, 可以使网站的css.js .xml.html 文件在传输时进行压缩,提高访问速度, 进而优化Nginx性能! Web网站上的图片,视频等其它多媒体文件以及大文件,因 ...
- Modbus新手教程
REDISANT 提供互联网与物联网开发测试套件 # 互联网与中间件: Redis Assistant ZooKeeper Assistant Kafka Assistant RocketMQ Ass ...