156 lines
3.4 KiB
Markdown
156 lines
3.4 KiB
Markdown
|
## 题目地址
|
|||
|
https://leetcode.com/problems/koko-eating-bananas/description/
|
|||
|
|
|||
|
## 题目描述
|
|||
|
```
|
|||
|
Koko loves to eat bananas. There are N piles of bananas, the i-th pile has piles[i] bananas. The guards have gone and will come back in H hours.
|
|||
|
|
|||
|
Koko can decide her bananas-per-hour eating speed of K. Each hour, she chooses some pile of bananas, and eats K bananas from that pile. If the pile has less than K bananas, she eats all of them instead, and won't eat any more bananas during this hour.
|
|||
|
|
|||
|
Koko likes to eat slowly, but still wants to finish eating all the bananas before the guards come back.
|
|||
|
|
|||
|
Return the minimum integer K such that she can eat all the bananas within H hours.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Example 1:
|
|||
|
|
|||
|
Input: piles = [3,6,7,11], H = 8
|
|||
|
Output: 4
|
|||
|
Example 2:
|
|||
|
|
|||
|
Input: piles = [30,11,23,4,20], H = 5
|
|||
|
Output: 30
|
|||
|
Example 3:
|
|||
|
|
|||
|
Input: piles = [30,11,23,4,20], H = 6
|
|||
|
Output: 23
|
|||
|
|
|||
|
|
|||
|
Note:
|
|||
|
|
|||
|
1 <= piles.length <= 10^4
|
|||
|
piles.length <= H <= 10^9
|
|||
|
1 <= piles[i] <= 10^9
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
## 思路
|
|||
|
符合直觉的做法是,选择最大的堆的香蕉数,然后试一下能不能行,如果不行则直接返回上次计算的结果,
|
|||
|
如果行,我们减少1个香蕉,试试行不行,依次类推。计算出刚好不行的即可。这种解法的时间复杂度是O(n)。
|
|||
|
|
|||
|
这道题如果能看出来是二分法解决,那么其实很简单。为什么它是二分问题呢?
|
|||
|
我这里画了个图,我相信你看了就明白了。
|
|||
|
|
|||
|
![koko-eating-bananas](../assets/problems/koko-eating-bananas.png)
|
|||
|
|
|||
|
## 关键点解析
|
|||
|
|
|||
|
- 二分查找
|
|||
|
|
|||
|
|
|||
|
## 代码
|
|||
|
|
|||
|
```js
|
|||
|
/*
|
|||
|
* @lc app=leetcode id=875 lang=javascript
|
|||
|
*
|
|||
|
* [875] Koko Eating Bananas
|
|||
|
*
|
|||
|
* https://leetcode.com/problems/koko-eating-bananas/description/
|
|||
|
*
|
|||
|
* algorithms
|
|||
|
* Medium (44.51%)
|
|||
|
* Total Accepted: 11.3K
|
|||
|
* Total Submissions: 24.8K
|
|||
|
* Testcase Example: '[3,6,7,11]\n8'
|
|||
|
*
|
|||
|
* Koko loves to eat bananas. There are N piles of bananas, the i-th pile has
|
|||
|
* piles[i] bananas. The guards have gone and will come back in H hours.
|
|||
|
*
|
|||
|
* Koko can decide her bananas-per-hour eating speed of K. Each hour, she
|
|||
|
* chooses some pile of bananas, and eats K bananas from that pile. If the
|
|||
|
* pile has less than K bananas, she eats all of them instead, and won't eat
|
|||
|
* any more bananas during this hour.
|
|||
|
*
|
|||
|
* Koko likes to eat slowly, but still wants to finish eating all the bananas
|
|||
|
* before the guards come back.
|
|||
|
*
|
|||
|
* Return the minimum integer K such that she can eat all the bananas within H
|
|||
|
* hours.
|
|||
|
*
|
|||
|
*
|
|||
|
*
|
|||
|
*
|
|||
|
*
|
|||
|
*
|
|||
|
*
|
|||
|
* Example 1:
|
|||
|
*
|
|||
|
*
|
|||
|
* Input: piles = [3,6,7,11], H = 8
|
|||
|
* Output: 4
|
|||
|
*
|
|||
|
*
|
|||
|
*
|
|||
|
* Example 2:
|
|||
|
*
|
|||
|
*
|
|||
|
* Input: piles = [30,11,23,4,20], H = 5
|
|||
|
* Output: 30
|
|||
|
*
|
|||
|
*
|
|||
|
*
|
|||
|
* Example 3:
|
|||
|
*
|
|||
|
*
|
|||
|
* Input: piles = [30,11,23,4,20], H = 6
|
|||
|
* Output: 23
|
|||
|
*
|
|||
|
*
|
|||
|
*
|
|||
|
*
|
|||
|
* Note:
|
|||
|
*
|
|||
|
*
|
|||
|
* 1 <= piles.length <= 10^4
|
|||
|
* piles.length <= H <= 10^9
|
|||
|
* 1 <= piles[i] <= 10^9
|
|||
|
*
|
|||
|
*
|
|||
|
*
|
|||
|
*
|
|||
|
*
|
|||
|
*/
|
|||
|
|
|||
|
function canEatAllBananas(piles, H, mid) {
|
|||
|
let h = 0;
|
|||
|
for(let pile of piles) {
|
|||
|
h += Math.ceil(pile / mid);
|
|||
|
}
|
|||
|
|
|||
|
return h <= H;
|
|||
|
}
|
|||
|
/**
|
|||
|
* @param {number[]} piles
|
|||
|
* @param {number} H
|
|||
|
* @return {number}
|
|||
|
*/
|
|||
|
var minEatingSpeed = function(piles, H) {
|
|||
|
let lo = 1,
|
|||
|
hi = Math.max(...piles);
|
|||
|
|
|||
|
while(lo <= hi) {
|
|||
|
let mid = lo + ((hi - lo) >> 1);
|
|||
|
if (canEatAllBananas(piles, H, mid)) {
|
|||
|
hi = mid - 1;
|
|||
|
} else {
|
|||
|
lo = mid + 1;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return lo; // 不能选择hi
|
|||
|
};
|
|||
|
```
|
|||
|
|