思路:
- 最慢肯定是一小时吃一根
- 因为吃完一堆之后一个小时之内不能再吃更多香蕉,所以最快吃完的速度为:一个小时吃掉数量最大的那堆香蕉,即
piles中的最大值 - 现在想查找到一个最小值
k在h小时内吃完所有香蕉。可以暴力从1开始逐个尝试 - 但是效率更高的是使用二分查找
function minEatingSpeed(piles: number[], h: number): number {
let left = 1
let right = Math.max.apply(null, piles)
while (left < right) {
let mid = left + ((right - left) >> 1)
if (calcHoursEatting(piles, mid) > h) {
left = mid + 1
} else {
right = mid
}
}
return left
}
function calcHoursEatting(piles: number[], k: number) {
let sum = 0
piles.forEach((pile) => {
sum += ((pile + (k - 1)) / k) >> 0
})
return sum
}