每日算法系列【LeetCode 875】爱吃香蕉的珂珂

简介: 珂珂喜欢吃香蕉。这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 H 小时后回来。珂珂可以决定她吃香蕉的速度 K (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 K 根。如果这堆香蕉少于 K 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。返回她可以在 H 小时内吃掉所有香蕉的最小速度 K(K 为整数)。

题目描述


珂珂喜欢吃香蕉。这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 H 小时后回来。

珂珂可以决定她吃香蕉的速度 K (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 K 根。如果这堆香蕉少于 K 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。

珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。

返回她可以在 H 小时内吃掉所有香蕉的最小速度 K(K 为整数)。

示例1

输入:
piles = [3,6,7,11], H = 8
输出
:4

示例2

输入:
piles = [30,11,23,4,20], H = 5
输出:
30

示例3

输入:
piles = [30,11,23,4,20], H = 6
输出:
23

提示

  • 1 <= piles.length <= 10^4
  • piles.length <= H <= 10^9
  • 1 <= piles[i] <= 10^9

题解


简单复述一下题意,就是有 N 堆香蕉,每堆有 piles[i] 个,现在要求一个整数速度 K ,吃一堆香蕉要的时间是 piles[i] / K (不是整数要上取整),问使得吃完所有香蕉所需总时间小于等于 H 的最小速度 K 是多少?

显然 K 越小,吃每堆香蕉所需要的时间就越长,总时间也就越长,那么自然而然可以想到二分答案 K 。

对于当前的 K ,我们遍历数组,算出总时间,如果总时间大于 H ,那就说明 K 太小了,还得提速;如果总时间小于等于 H ,那就说明速度 K 还可以降一点,总时间可能不变(因为存在上取整),也可能变大。


image.png

代码


c++

class Solution {
   public:
       int minEatingSpeed(vector<int>& piles, int H) {
       int maxv = *max_element(piles.begin(), piles.end());        int n = piles.size(); 
       int l = 1, r = maxv;
       while (l < r) {
       int m = (r - l) / 2 + l; 
       int cnt = 0; 
       for (int i = 0; i < n; ++i) { 
      cnt += (piles[i] + m - 1) / m;
     }
    if (cnt > H) l = m + 1; 
   else r = m;
   }
  return r;
 }
};

python

class Solution:
  def minEatingSpeed(self, piles: List[int], H: int) -> int: 
   maxv = max(piles) 
   l = 1
    r = maxv 
     while l < r: 
      m = (r - l) // 2 + l
       cnt = 0
        for p in piles: 
        cnt += (p + m - 1)
        // m 
        if cnt > H:
        l = m + 1 
       else: 
      r = m 
     return r

后记


注意上面的代码还是有几个小细节的:

  • 二分终止条件设置的是 l >= r ,所以 l 的更新必须是 l = m + 1 ,因为如果 l = r - 1 的话,m 会等于 l 。
  • 为了防止整型溢出,计算 l 和 r 均值的时候不要写 (l + r) / 2 。
  • 上取整简单写法就是 (p + m - 1) / m 。

image.png

作者简介:godweiyang知乎同名华东师范大学计算机系硕士在读,方向自然语言处理与深度学习喜欢与人分享技术与知识,期待与你的进一步交流~


相关文章
|
5月前
|
算法 定位技术 数据安全/隐私保护
微信加人不频繁技巧,记得收藏哦!
微信社交拓展的科学方法论
|
9月前
|
开发框架 人工智能 API
《鸿蒙开发工具链深度洞察:优缺剖析与提效指南》
鸿蒙系统作为创新型操作系统,其应用开发工具链具备显著优势:统一开发框架支持多设备适配,丰富易用的API简化功能实现,DevEco Studio提供强大开发支持,实时预览与热更新提升效率。然而,生态成熟度、多端深度优化及部分高级功能仍有不足。开发者可通过深入学习工具、利用开源资源、优化流程和提前规划适配来提高效率。随着工具链不断完善,开发者将助力鸿蒙生态繁荣发展。
579 0
|
存储 C语言
C语言的数据类型及其存储方式(上)
C语言的数据类型及其存储方式
276 0
|
5月前
|
Ubuntu Linux 数据安全/隐私保护
Ubuntu 安装教程(U 盘安装 Ubuntu 详细教程)
完成上述步骤后,Ubuntu将开始安装在你的电脑上。安装完成后,重启电脑,并按提示移除U盘。电脑将自动从硬盘启动进入新装的Ubuntu系统。现在你可以开始探索Ubuntu带来的全新体验了!
|
自然语言处理 安全 搜索推荐
外贸企业邮箱精选:国内三大优质邮件服务推荐
该内容介绍了国内三大外贸企业邮箱:Zoho Mail、腾讯企业邮箱和阿里企业邮箱。Zoho Mail以其简洁界面、自定义域名、深度集成办公套件和高效邮件管理脱颖而出,同时具备高级安全特性。腾讯企业邮箱强调个性化定制和多平台同步,而阿里企业邮箱则结合阿里云生态提供智能协同办公和高可用性服务。这三款邮箱均针对企业需求提供了不同的优势和功能。
669 0
|
SQL 存储 关系型数据库
MySQL设计规约问题之为什么要尽量将大的SQL语句拆分成小的SQL语句
MySQL设计规约问题之为什么要尽量将大的SQL语句拆分成小的SQL语句
|
移动开发 编解码
数学建模常用模型05 :模糊综合评价法
数学建模常用模型05 :模糊综合评价法
28876 3
|
搜索推荐 算法
深入探究排序算法:快速排序的实现与优化
排序算法是计算机科学中的基础知识,它们在各种应用和场景中都扮演着重要角色。本文将深入探讨一种经典的排序算法——快速排序,并介绍其实现原理及优化技巧。
196 1
|
运维 Linux 开发者
Linux 面试必备 -IO 重定向及管道高级进阶 | 学习笔记
快速学习Linux 面试必备 -IO 重定向及管道高级进阶
269 0
|
安全 Java 对象存储
图片内容安全实战教程
内容安全技术是基于阿里云视觉分析技术和深度识别技术。本教程为您介绍如何通过智能视觉平台的图片检测能力保证内容安全。
图片内容安全实战教程