链接: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. MS06-040漏洞研究(下)【转载】

    课程简介 经过前两次的分析,我们已经对Netapi32.dll文件中所包含的漏洞成功地实现了利用.在系统未打补丁之前,这确实是一个非常严重的漏洞,那么打了补丁之后,这个动态链接库是不是就安全了呢?答案 ...

  2. 【easycode】使用说明 & 示例

    语法 ## 是模板的注释,不会生成 # 全局的一些设置 $ 使用库函数或者调用全局定义的内容 常用方法 数据库表信息 ${tableInfo} comment 表备注 name 表名 fullColu ...

  3. Day004 while和do-while循环

    循环结构(while和do-while) while循环 do...while循环 for循环 在Java5中引入了一种主要用于数据的增强for循环 //输出1~100 int i=0; while ...

  4. java之Map和Collection

    java中保存对象的容器可分为两类: 1.Map.Map是以键值对的形式来保存一组对象,可以通过键来查找值. 2.Collection.用来保存独立对象的序列.Collection又可分为三种类型: ...

  5. mybatis增删改返回的int是-2147482646,并不是想要返回结果

    MyBatis发现更新和插入返回值一直为"-2147482646"的错误是由defaultExecutorType设置引起的,如果设置为batch,更新返回值就会丢失,返回结果就只 ...

  6. Linux下线程pid和tid

    #include <stdio.h> #include <pthread.h> #include <sys/types.h> #include <sys/sy ...

  7. Scrum Meeting 2

    Basic Info where:三号教学楼 when:2020/4/25 target: 简要汇报一下已完成任务,下一步计划与遇到的问题 Progress Team Member Position ...

  8. 墙裂推荐一波mysql学习资源

    在日常工作与学习中,无论是开发.运维.测试,还是架构师,数据库是一门必不可少的"必修课", 也是必备的涨薪神器.在互联网公司中,开源数据库用得比较多的当属 MySQL 了. 但my ...

  9. NumPy之:ndarray中的函数

    NumPy之:ndarray中的函数 目录 简介 简单函数 矢量化数组运算 条件逻辑表达式 统计方法 布尔数组 排序 文件 线性代数 随机数 简介 在NumPy中,多维数组除了基本的算数运算之外,还内 ...

  10. mybatis-plus批量插入saveBatch太慢?我愿意称rewriteBatchedStatements为神

    最近在做项目优化,代码优化之后,测试接口,好家伙.一个定时任务接口执行要10秒左右. 一点点追踪,给每个方法打上执行时间,一点点缩小范围.好家伙,终于让我锁定了目标. 这是mybatis-plus的批 ...