437. 书籍复印

描述

给定 n 本书, 第 i 本书的页数为 pages[i]. 现在有 k 个人来复印这些书籍, 而每个人只能复印编号连续的一段的书, 比如一个人可以复印 pages[0], pages[1], pages[2], 但是不可以只复印 pages[0], pages[2], pages[3] 而不复印 pages[1].

所有人复印的速度是一样的, 复印一页需要花费一分钟, 并且所有人同时开始复印. 怎样分配这 k 个人的任务, 使得这 n 本书能够被尽快复印完?

返回完成复印任务最少需要的分钟数.

  • 书籍页数总和小于等于2147483647

样例 1:

输入: pages = [3, 2, 4], k = 2
输出: 5
解释: 第一个人复印前两本书, 耗时 5 分钟. 第二个人复印第三本书, 耗时 4 分钟.

样例 2:

输入: pages = [3, 2, 4], k = 3
输出: 4
解释: 三个人各复印一本书.

挑战

时间复杂度 O(nk)

原题传送门


文章目录

  • 437. 书籍复印
    • 描述
    • 样例 1:
    • 样例 2:
    • 挑战
  • 题解
  • 最后说两句
  • 声明

题解

public class Solution {/*** @param pages: an array of integers* @param k: An integer* @return: an integer*/public int copyBooks(int[] pages, int k) {// write your code here// 最多就是一个人复印完,所以需要所有页数之和int max = 0;// 最少的情况是每个人复印一本,所以最少需要花费那本页数最大的时间int min = 0;for (int page : pages) {max += page;min = Math.max(min, page);}// 根据人数可以算出平均复制页数,或者说平均花费时间,而最终无论怎么分配,时间至少等于平均时间min = Math.max(min, (max + k - 1) / k);// 二分查找法找到最佳点int low  = min;int high = max;while (low <= high) {int mid = (low + high) >>> 1;boolean ok = true;// 贪心算法计算按照给定时间至少需要几个人int time = mid;// 需要人数int ps   = 1;for (int page : pages) {if (page > time) {time = mid;++ps;if (ps > k) {ok = false;break;}}if (page < time) {time -= page;}}if (ok) {high = mid - 1;} else {low = mid + 1;}}return low;}
}

最后说两句

非常感谢你阅读本文章,如果你觉得本文对你有所帮助,请留下你的足迹,点个赞,留个言,多谢~

作者水平有限,如果文章内容有不准确的地方,请指正。

希望小伙伴们都能每天进步一点点。

声明

本文由二当家的白帽子博客原创,转载请注明来源,谢谢~

【精】LintCode领扣算法问题答案:437. 书籍复印相关推荐

  1. 【精】LintCode领扣算法问题答案:入门

    文章目录 23. 判断数字与字母字符 描述 题解 25. 打印X 描述 题解 37. 反转一个3位整数 描述 题解 145. 大小写转换 描述 题解 366. 斐波纳契数列 描述 题解 454. 矩阵 ...

  2. 【精】LintCode领扣算法问题答案:1029. 寻找最便宜的航行旅途(最多经过k个中转站)

    1029. 寻找最便宜的航行旅途(最多经过k个中转站) 描述 有n个城市被一些航班所连接.每个航班 (u,v,w) 从城市u出发,到达城市v,价格为w. 给定城市数目 n,所有的航班flights.你 ...

  3. 【精】LintCode领扣算法问题答案:1084. “马”在棋盘上的概率

    1084. "马"在棋盘上的概率 描述 已知一个 NxN 的国际象棋棋盘,棋盘的行号和列号都是从 0 开始.即最左上角的格子记为 (0, 0),最右下角的记为 (N-1, N-1) ...

  4. 【精】LintCode领扣算法问题答案:306. 商品列表

    306. 商品列表: 有一个商品列表,该列表是由L1.L2两个子列表拼接而成.当用户浏览并翻页时,需要从列表L1.L2中获取商品进行展示.展示规则如下: 用户可以进行多次翻页,用offset表示用户已 ...

  5. 【精】LintCode领扣算法问题答案:1086. 重复字符串匹配

    1086. 重复字符串匹配: 给定两个字符串A和B,找到A必须重复的最小次数,以使得B是它的子字符串. 如果没有这样的解决方案,返回-1. A和B的长度在1到10000之间. 样例 1 输入 : A ...

  6. 【精】LintCode领扣算法问题答案:316. 组合集

    316. 组合集 描述 给一个数组,给出所有可能的排列组合出的数小于给定的数字 1 <= len(num) <= 10 0 <= num[i] <= 9 target < ...

  7. 【精】LintCode领扣算法问题答案:993. 数组划分 I

    993. 数组划分 I: 给一个有 2n 个整数的数组,你的任务是把这些整数分成 n 组,如(a1, b1),(a2, b2),-,(an, bn).并且使得 i 从 1 到 n 的 min(ai, ...

  8. 【精】LintCode领扣算法问题答案:1371. 链表组件

    1371. 链表组件 描述 给定一个链表(链表结点包含一个整型值)的头结点 head. 同时给定列表 G,该列表是上述链表中整型值的一个子集. 返回列表 G 中组件的个数,这里对组件的定义为:链表中一 ...

  9. 【精】LintCode领扣算法问题答案:3. 统计数字

    3. 统计数字 计算数字 k 在 0 到 n 中的出现的次数,k 可能是 0~9 的一个值. 样例 1: 输入:k = 1, n = 1 输出:1 解释:在 [0, 1] 中,我们发现 1 出现了 1 ...

  10. 【精】LintCode领扣算法问题答案:626. 矩形重叠

    626. 矩形重叠 给定两个矩形,判断这两个矩形是否有重叠. l1代表第一个矩形的左上角 r1代表第一个矩形的右下角 l2代表第二个矩形的左上角 r2代表第二个矩形的右下角 保证:l1 != r1 并 ...

最新文章

  1. 人工智能芯片支持超低功耗器件的推理
  2. 大数据算法系列——布隆过滤器
  3. Linux下如何生成core dump 文件(解决segment fault段错误的问题)
  4. 你会因为什么原因而离职
  5. 2021云上架构与运维峰会12月10日线上开启,五大精彩看点不容错过
  6. OSS.Social微信项目标准库介绍
  7. 转:Kafka事务使用和编程示例/实例
  8. java 中的堆和栈
  9. ajax 同步怎么回调,Ajax jquery同步回调成功
  10. java pdf增删改查_如何利用Java代码操作索引库?
  11. 看看ConcurrentLinkedQueue源码 in Java 9
  12. 【手写数字识别】基于matlab GUI BP神经网络手写数字识别(手写+带面板)【含Matlab源码 1196期】
  13. 如何关闭mac的SIP
  14. 计算机一级安装包怎么升级,详细教您win7如何升级为sp1
  15. 区块链入门系列之P2P
  16. 金融分析与风险管理——期权BSM模型
  17. 在html中书名号怎么写,html范本
  18. CAD中样条曲线Spline怎样才能分解成多段弧arc?
  19. 揭秘中国商品期货市场的9大重要因子
  20. 把Excel批注的“红三角”放在单元格左上角_44个Excel使用技巧:怪不得同事表格类工作那么快完成,学以致用...

热门文章

  1. 学习记录 Halcon 图片拼接
  2. 5. 位操作指令 AND,ORR, TST,BIC
  3. 内网禁用u盘 远程协助_如何在Windows 10中禁用远程协助
  4. 查询2021高考成绩位次,2021年江苏高考位次表及高考个人成绩排名查询
  5. 我喜欢的刀刀语录(一)
  6. <爬虫> 豆瓣电影排行榜(含代码)
  7. 裤子尺码对照表eur40_裤子的欧码32 34 36 38 40代表什么意思
  8. 密探查询系统服务器码,车辆国几排放查询
  9. 进制转换(简单的能看懂就够了)
  10. python怎么检查页面边距_Matplotlib页边距