爱吃香蕉的珂珂

简介: 🎈每天进行一道算法题目练习,今天的题目是“爱吃香蕉的珂珂”。

说在前面

🎈每天进行一道算法题目练习,今天的题目是“爱吃香蕉的珂珂”。

问题描述

珂珂喜欢吃香蕉。这里有 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

思路分析

首先我们要先理解题目的意思,从题目中提取出有用的信息。阅读完题目后我们可以得到这么几个信息:

  • 1、珂珂一个小时内只会吃同一堆香蕉里面的香蕉;
  • 2、珂珂可以改变吃香蕉的速度k
  • 3、珂珂需要在h小时内吃完香蕉

题目会给出香蕉的堆数、每一堆的香蕉数目以及h的值,我们需要求出满足条件的k的最小值。

确定二分区间

由于吃香蕉的速度和是否可以在规定时间内吃掉所有香蕉之间存在单调性,因此可以使用二分查找的方法得到最小速度 k。由上面得出的信息1可以知道,珂珂一个小时内只会吃同一堆香蕉里面的香蕉,所以二分区间的最大值为香蕉堆中香蕉数目的最大值high = Math.max(...piles);,提示中有piles[i]所以二分区间的最小值应该为1low = 1;

缩短区间

每次取区间的中间数为k计算吃完所有香蕉的时间h

const getTime = (piles, speed) => {
    let time = 0;
    for (const pile of piles) {
        const curTime = Math.floor((pile + speed - 1) / speed);
        time += curTime;
    }
    return time;
};

当前速度吃完所有香蕉的时间比h长则说明速度应该加快,反之则应减慢:

time <= h ? (k = speed,high = speed) : low = speed + 1;

不断缩小区间来锁定答案:

while (low < high) {
    const speed = Math.floor((high + low) / 2);
    const time = getTime(piles, speed);
    time <= h ? (k = speed,high = speed) : low = speed + 1;
}

完整代码如下:

AC代码

/**
 * @param {number[]} piles
 * @param {number} h
 * @return {number}
 */
 var minEatingSpeed = function(piles, h) {
    let low = 1;
    let high = Math.max(...piles);
    let k = high;
    while (low < high) {
        const speed = Math.floor((high + low) / 2);
        const time = getTime(piles, speed);
        time <= h ? (k = speed,high = speed) : low = speed + 1;
    }
    return k;
}

const getTime = (piles, speed) => {
    let time = 0;
    for (const pile of piles) {
        const curTime = Math.floor((pile + speed - 1) / speed);
        time += curTime;
    }
    return time;
};

说在后面

🎉这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,平时也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。
目录
相关文章
|
机器学习/深度学习 自动驾驶 算法
深度学习在图像识别中的应用与发展
本文将深入探讨深度学习技术在图像识别领域的应用,通过案例分析展示其最新进展。我们将从基本原理出发,了解深度学习如何改变图像处理和识别的方式,并展望其未来可能的发展方向。
|
存储 架构师 测试技术
架构之道——人人都是架构师
本文的探讨和编写主要围绕三个方面:架构是什么?架构师要解决的问题有哪些?解决这些问题的方法论是什么?最后作者希望人人都能具备架构师思维。
|
人工智能 算法 安全
评测报告:《10 分钟构建 AI 客服并应用到网站、钉钉或微信中》
该方案简化了在网站及社交平台添加AI助手的过程,通过直观的设计使用户能迅速上手。阿里云控制台让创建及配置AI变得轻而易举,实现十分钟内快速部署。详细的引导步骤与文档显著降低了学习门槛,即使初次接触也能顺利解决问题。方案提供了高度定制化的选项以满足企业多样化需求,并确保在生产环境中稳定运行。此外,阿里云AI客服解决方案具备丰富的功能,如语音交互、图片识别等,配合快速准确的响应,极大提升了用户体验。总体而言,该方案凭借其易用性和强大功能赢得了好评。
|
10月前
|
算法 测试技术
【深度优先搜索篇】带你暴力dfs去破解飞机降落和八皇后问题(轻松拿捏版)
【深度优先搜索篇】带你暴力dfs去破解飞机降落和八皇后问题(轻松拿捏版)
|
10月前
|
人工智能 监控 数据挖掘
2025年有哪些工单管理系统值得推荐?
随着企业数字化转型加速,工单管理系统成为优化流程、提升服务的关键工具。2025年备受关注的主流系统包括:合力亿捷,中国移动,中国联通,中国电信等
253 0
|
移动开发 人工智能 物联网
移动应用与系统:探索现代移动开发的趋势与挑战####
本文深入探讨了当前移动应用开发和移动操作系统的最新趋势、技术挑战及未来展望。通过分析Android、iOS等主流平台的演进,以及跨平台开发工具的兴起,揭示了开发者在构建高性能、安全且用户友好的移动应用时面临的机遇与挑战。文章还强调了人工智能、物联网集成及5G技术如何重塑移动生态系统,为读者提供了一个全面的行业视角。 ####
|
程序员
程序员的挑战与机遇:中国技术人才的现状
在中国,程序员作为技术行业的中坚力量,面临着一系列独特的挑战和机遇。这些挑战不仅影响着他们的职业发展,也关系到整个技术行业的进步。本文将探讨中国程序员面临的一些主要问题,并分析这些问题背后的原因,同时探讨可能的解决方案。
217 1
|
算法 Java 开发者
《黑神话:悟空》Xbox版的技术挑战与解决方案
【8月更文第26天】《黑神话:悟空》是一款备受期待的动作角色扮演游戏,以其精美的画面和丰富的中国神话故事背景而闻名。本篇文章将重点介绍游戏在Xbox平台上的技术挑战及其解决方案,特别是针对内存管理的问题。通过深入分析,我们将了解开发团队是如何克服这些挑战,确保游戏在Xbox上能够流畅运行的。
482 4
|
传感器 数据可视化 网络协议
DIY可视化整合MQTT生成UniApp源码
DIY可视化整合MQTT生成UniApp源码
240 0
|
机器学习/深度学习 人工智能 算法
人工智能伦理的十字路口:我们如何平衡创新与责任?
【8月更文挑战第20天】随着人工智能技术的飞速发展,其在各行各业的应用日益广泛。然而,伴随技术进步而来的是一系列伦理问题和道德挑战。本文将探讨人工智能伦理的核心议题,包括隐私权、自动化失业、算法偏见和机器人权利等,旨在引发读者对于在追求技术创新的同时,如何确保社会责任和伦理标准得到维护的深入思考。