Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[2022-06-07]907. 爱吃香蕉的珂珂👋数组👋二分查找 #48

Open
webVueBlog opened this issue Jun 7, 2022 · 1 comment
Open

Comments

@webVueBlog
Copy link
Member

题目链接: https://leetcode-cn.com/problems/koko-eating-bananas

难度: Medium
标签: 数组 二分查找

@dreamjean
Copy link
Collaborator

dreamjean commented Jun 15, 2022

875. 爱吃香蕉的珂珂

Description

Difficulty: 中等

Related Topics: 数组, 二分查找

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

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

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

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

示例 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 <= 104
  • piles.length <= h <= 109
  • 1 <= piles[i] <= 109

Solution

思路:

  • 根据条件,珂珂吃完所有香蕉时不会转移到另一堆,因此可以得到最大和最小速度:min =1 (banana / h)max = max(piles)
  • 此时就可以利用二分法找出平均速度 mid
  • 再根据平均速度计算来统计出所有的时间
  • 最后再找出h范围内的速度

Language: JavaScript

/**
 * @param {number[]} piles
 * @param {number} h
 * @return {number}
 */
var minEatingSpeed = function(piles, h) {
    let [min, max] = [1, Math.max(...piles)];
    
    while (min < max) {
        const mid = (min + max) >>> 1;
        if (timeLessThenH(h, mid, piles)) max = mid;
        else min = mid + 1;
    }

    return min;
};

// 此处要注意用Math.ceil()来取得所需时间的上限
const timeLessThenH = (h, speed, arr) => arr.reduce((time, num) => time += Math.ceil(num / speed), 0) <= h;

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants