爱吃香蕉的珂珂

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

说在前面

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

问题描述

珂珂喜欢吃香蕉。这里有 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,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,平时也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。
目录
相关文章
|
5月前
BUUCTF 我吃三明治 1
BUUCTF 我吃三明治 1
27 1
|
9月前
|
SQL 安全 Linux
月饼杯II
月饼杯II
99 0
|
10月前
|
算法 Cloud Native
【刷题日记】875. 爱吃香蕉的珂珂
本次刷题日记的第 57 篇,力扣题为:875. 爱吃香蕉的珂珂,中等
115 0
【刷题日记】875. 爱吃香蕉的珂珂
PTA 1092 最好吃的月饼
月饼是久负盛名的中国传统糕点之一,自唐朝以来,已经发展出几百品种。
80 0
|
存储
【LeetCode】这儿童节的糖不好吃啊
【LeetCode】这儿童节的糖不好吃啊
117 0
【LeetCode】这儿童节的糖不好吃啊
(C/C++)1092 最好吃的月饼 (20 分)
月饼是久负盛名的中国传统糕点之一,自唐朝以来,已经发展出几百品种。若想评比出一种“最好吃”的月饼,那势必在吃货界引发一场腥风血雨…… 在这里我们用数字说话,给出全国各地各种月饼的销量,要求你从中找出销量冠军,认定为最好吃的月饼。
188 0
(C/C++)1092 最好吃的月饼 (20 分)
|
弹性计算 云计算
|
新零售
今天起,我们喝的百年牛奶要变了!
今天,光明乳业与阿里云达成战略合作。双方将整合优质资源,形成聚合效应,共同推动在新零售、泛电商等领域深化合作,打造引领未来商业模式的新零售标杆。
4796 0
|
开发者 人工智能 云栖大会
除了吃月饼,中秋节还能干啥?
明天 八月十五,团圆夜,花好月圆之际,除了吃月饼,还能干啥?阿里妹带来双重好礼,陪你过中秋~
7384 0