一日一练:爱吃香蕉的珂珂

160 阅读1分钟

这里有 n 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 h 小时后回来。珂珂可以决定她吃香蕉的速度 k。每个小时,她将会选择一堆香蕉,从中吃掉 k 根。如果这堆香蕉少于 k 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。 返回她可以在 h 小时内吃掉所有香蕉的最小速度 k(k 为整数)

思路:

  1. 最慢肯定是一小时吃一根
  2. 因为吃完一堆之后一个小时之内不能再吃更多香蕉,所以最快吃完的速度为:一个小时吃掉数量最大的那堆香蕉,即piles中的最大值
  3. 现在想查找到一个最小值 kh小时内吃完所有香蕉。可以暴力从1开始逐个尝试
  4. 但是效率更高的是使用二分查找
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
}