链接: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 天内送达包裹的能力的更多相关文章

  1. Leetcode之二分法专题-1011. 在 D 天内送达包裹的能力(Capacity To Ship Packages Within D Days)

    Leetcode之二分法专题-1011. 在 D 天内送达包裹的能力(Capacity To Ship Packages Within D Days) 传送带上的包裹必须在 D 天内从一个港口运送到另 ...

  2. Leetcode 1014. 在 D 天内送达包裹的能力

    1014. 在 D 天内送达包裹的能力  显示英文描述 我的提交返回竞赛   用户通过次数197 用户尝试次数272 通过次数203 提交次数538 题目难度Medium 传送带上的包裹必须在 D 天 ...

  3. 刷题-力扣-1011. 在 D 天内送达包裹的能力

    1011. 在 D 天内送达包裹的能力 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/capacity-to-ship-packag ...

  4. [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 ...

  5. 【JavaScript】Leetcode每日一题-在D天内送包裹的能力

    [JavaScript]Leetcode每日一题-在D天内送包裹的能力 [题目描述] 传送带上的包裹必须在 D 天内从一个港口运送到另一个港口. 传送带上的第 i 个包裹的重量为 weights[i] ...

  6. Java实现 LeetCode 478 在圆内随机生成点

    478. 在圆内随机生成点 给定圆的半径和圆心的 x.y 坐标,写一个在圆中产生均匀随机点的函数 randPoint . 说明: 输入值和输出值都将是浮点数. 圆的半径和圆心的 x.y 坐标将作为参数 ...

  7. Swift LeetCode 目录 | Catalog

    请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift    说明:题目中含有$符号则为付费题目. 如 ...

  8. LeetCode:数组专题

    数组专题 有关数组的一些 leetcode 题,在此做一些记录,不然没几天就忘光光了 二分查找 双指针 滑动窗口 前缀和/差分数组 二分查找 本文内容摘录自公众号labuladong中有关二分查找的文 ...

  9. 2019年7-8月Leetcode每日训练日志

    2019-08-29 #274 H指数 2019-08-28 #287 寻找重复数 #875 爱吃香蕉的珂珂 #704 二分查找 2019-08-27 #744 寻找比目标字母大的最小字母 #225 ...

随机推荐

  1. <JVM下篇:性能监控与调优篇>04-JVM运行时参数

    笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...

  2. spring boot 与 Mybatis整合(*)

    在pom.xml文件中加入数据库.spring-mybatis整合 <!-- spring boot 整合mybatis --> <dependency> <groupI ...

  3. 分布式ID

    需求 全局唯一 高性能 高可用 简单易用 UUID 优点: 唯一 不依赖于任何第三方服务 缺点: 是字符串类型而非数字,不满足数字ID的需求 字符串太长了,DB查询效率受影响 数据库自增ID 如果使用 ...

  4. Redis数据结构—跳跃表

    目录 Redis数据结构-跳跃表 跳跃表产生的背景 跳跃表的结构 利用跳跃表查询有序链表 Redis跳跃表图示 Redis跳跃表数据结构 小结 Redis数据结构-跳跃表 大家好,我是白泽,最近学校有 ...

  5. 依赖倒置原则(Dependence Inversion Principle)

    目录 背景 说明 例子 "倒置"的解释 总结 参考资料 背景 这几天组内的人一起学习DDD,里面再次提到了依赖倒置原则,在这学习过程中,大家又讨论了一下依赖倒置原则. 说明 采用依 ...

  6. 最优运输(Optimal Transfort):从理论到填补的应用

    目录 引言 1 背景 2 什么是最优运输? 3 基本概念 3.1 离散测度 (Discrete measures) 3.2 蒙日(Monge)问题 3.3 Kantorovich Relaxation ...

  7. Codeforces Round #694 (Div. 2)

     A. Strange Partition 题意:就是求最小和最大的bi/x向上取整的和. 思路:见题解:https://blog.csdn.net/qq_45900709/article/detai ...

  8. Jenkins 基础篇 - 插件安装

    这一小节主要介绍 Jenkins 插件的安装,登录到 Jenkins 后,依次进入到[系统管理]→ [插件管理]→ [可选插件],在这里可以看到所有的 Jenkins 插件,如下图: 我们在最开始安装 ...

  9. 24.Qt Quick QML-Canvas和Context2D详解

    1.Canvas介绍Canvas是一个允许绘制直线和曲线.简单和复杂的形状.图形和引用的图形图像.它还可以添加文本.颜色.阴影.渐变和图案,并执行低级别像素操作.Canvas输出可以另存为图像文件或序 ...

  10. Java 正则表达式实例操作

    Regular Expression正则表达式,简称RegExp,常规通用的表达式,在多个开发语言中都有它的实现,可以通过正则表达式来快速的检索.匹配.查找.替换字符串中的文本. 简单实例 匹配网址 ...