leetcode:在 D 天内送达包裹的能力
链接:https://leetcode-cn.com/problems/capacity-to-ship-packages-within-d-days/
我是按照这个思路来做的。
如果随便给一个船的运载重量,判断一下在D天内能否运完货物?
代码如下
/**
* nums 货物
* power 船的运载重量
* D 给定的天数
*/
private boolean check(int[] nums, int power, int D) {
// count表示船的运载能力为power时,运完所有货物需要的天数
// 注意count的初始值和返回值的对应关系
int count = 1, cap = power;
for (int num : nums) {
// 船剩下的运载量小于num货物的重量,需要放到下一天去运
if (num > cap) {
count++;
cap = power;
}
cap -= num;
}
return count <= D;
}
有了这个函数好办了。剩下的我们只需要确定一下在题目给的条件下,船可能的最大运载量和最小运载量,然后使用二分查找不断逼近最小值即可。
由于货物不可分割,那么至少每天需要运一个货物,可知船最小的运载量就是最重的那个货物的重量。
假设所有货物一天运完,可知船最大的运载量是所有货物重量之和。
确定了这两个数,就好办了,请看代码。
class Solution {
public int shipWithinDays(int[] weights, int D) {
// max表示不考虑其他因素,船的最低运载能力,即一天运一个货物,此时最低运载能力就是所有货物里最重的
// sum为货物的总重量,也是船的最大运载能力,即一天运完所有货物
int max = 0, sum = 0;
for (int weight : weights) {
max = Math.max(max, weight);
sum += weight;
}
int left = max, right = sum;
// 二分查找,不断查找直到找到在D天内能运完所有货物的最低运载能力
while (left < right) {
int mid = left + (right - left) / 2;
if (check(weights, mid, D)) {
right = mid;
} else {
left = mid + 1;
}
}
return right;
}
/**
* nums 货物
* power 船的运载重量
* D 给定的天数
*/
private boolean check(int[] nums, int power, int D) {
// count表示船的运载能力为power时,运完所有货物需要的天数
// 注意count的初始值和返回值的对于关系
int count = 1, cap = power;
for (int num : nums) {
// 船剩下的运载量小于num货物的重量,需要放到下一天去运
if (num > cap) {
count++;
cap = power;
}
cap -= num;
}
return count <= D;
}
}

leetcode:在 D 天内送达包裹的能力的更多相关文章
- Leetcode之二分法专题-1011. 在 D 天内送达包裹的能力(Capacity To Ship Packages Within D Days)
Leetcode之二分法专题-1011. 在 D 天内送达包裹的能力(Capacity To Ship Packages Within D Days) 传送带上的包裹必须在 D 天内从一个港口运送到另 ...
- Leetcode 1014. 在 D 天内送达包裹的能力
1014. 在 D 天内送达包裹的能力 显示英文描述 我的提交返回竞赛 用户通过次数197 用户尝试次数272 通过次数203 提交次数538 题目难度Medium 传送带上的包裹必须在 D 天 ...
- 刷题-力扣-1011. 在 D 天内送达包裹的能力
1011. 在 D 天内送达包裹的能力 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/capacity-to-ship-packag ...
- [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] ...
- Java实现 LeetCode 478 在圆内随机生成点
478. 在圆内随机生成点 给定圆的半径和圆心的 x.y 坐标,写一个在圆中产生均匀随机点的函数 randPoint . 说明: 输入值和输出值都将是浮点数. 圆的半径和圆心的 x.y 坐标将作为参数 ...
- Swift LeetCode 目录 | Catalog
请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift 说明:题目中含有$符号则为付费题目. 如 ...
- LeetCode:数组专题
数组专题 有关数组的一些 leetcode 题,在此做一些记录,不然没几天就忘光光了 二分查找 双指针 滑动窗口 前缀和/差分数组 二分查找 本文内容摘录自公众号labuladong中有关二分查找的文 ...
- 2019年7-8月Leetcode每日训练日志
2019-08-29 #274 H指数 2019-08-28 #287 寻找重复数 #875 爱吃香蕉的珂珂 #704 二分查找 2019-08-27 #744 寻找比目标字母大的最小字母 #225 ...
随机推荐
- vscode 将本地项目上传到github、从github克隆项目以及删除github上的某个文件夹
一.将本地项目上传到github 1.创建本地仓库(文件夹) mkdir study//创建文件夹studycd study //进入study文件夹 2.通过命令git init把这个文件夹变成Gi ...
- Consul 服务的注册和发现
Consul 是Hashicorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.Consul是分布式的,高可用的,可横向扩展的. Consul 的主要特点有: Service Disc ...
- Rabbit MQ一些参数解释
//ConnectionFactory(连接工厂): 生产Connection的的工厂 //Connection(连接):是RabbitMQ的socket的长链接,它封装了socket协议相关部分逻辑 ...
- Scrum Meeting 4
Basic Info where:共享空间 when:2021/4/29 target: 简要汇报一下已完成任务,下一步计划与遇到的问题 Progress Team Member Position A ...
- CRM系统推动教育行业数字化转型
目前,教育培训的潜在市场规模巨大,并且保持着迅猛的发展态势.同时,随着众多外资企业不断涌入中国市场,与国内大大小小的培训机构展开竞争,所以教育行业的竞争也是非常的激烈.传统的教育行业亟待数字化转型,才 ...
- libminipng,压缩png的swift-framework
libminipng 通过lodepng解析png图片,使用pngquant算法进行压缩的swift-framework 方法说明: /// 通过PNG图片Data压缩 /// /// - Param ...
- 基于混合云模式的calico部署
开始前准备 确定calico数据存储 Calico同时支持kubernetes api和etcd数据存储.官方给出的建议是在本地部署中使用K8S API,仅支持Kubernetes模式.而官方给出的e ...
- ruby基础(二)
ruby语法基础 1.方法 方法时对象定义的与该对象相关的操作.在Ruby中,对象的所有的操作都被封装成 方法. 语法糖:语法糖是一种为了照顾一般人的习惯而产生的特殊语法. ruby中一切数据都是对象 ...
- [刷题] 226 Invert Binary Tree
要求 翻转一棵二叉树 实现 翻转左右子树,交换左右子树的根节点 1 class Solution { 2 public: 3 TreeNode* invertTree(TreeNode* root) ...
- 折腾gcc/g++链接时.o文件及库的顺序问题
gcc/g++链接时.o文件以及库的顺序问题 1 写在前面 最近换了xubuntu12.4,把原来的项目co出来编译的时候报"undefined reference to".猜测是 ...