875. 爱吃香蕉的珂珂

109 阅读1分钟

拿到题目最快能想到的思路是枚举所有吃完香蕉的速度,找到能吃完香蕉的最小的速度。

枚举的速度范围是[1... 最大堆的香蕉],因为速度不会小于1,也没有速度比最大香蕉堆更快的必要

var minEatingSpeed = function(piles, h) {
  // 枚举所有可以吃完香蕉的速度,找到最小的
  piles = piles.sort((a,b) => a - b)
  var maxSpeed = piles[piles.length - 1]
  var min = maxSpeed
  for(let i = 1; i <= maxSpeed; i ++) {
    var H = 0
    for(let j = 0 ; j < piles.length; j ++) {
      H += Math.ceil(piles[j] / i)
    }
    if(H <= h) {
      min = Math.min(min,i)
    }
  }
  return min
};

随即可以想到,[1... 最大速度]是一个单调区间,可以用二分法来解决

var minEatingSpeed = function(piles, h) {
  // 最小速度就是求下界l
  piles = piles.sort((a,b) => a - b)
  var maxSpeed = piles[piles.length - 1]
  var min = maxSpeed
  // 对速度区间 [1... maxSpeed] 做二分
  var l = 1 ,r = maxSpeed
  while(l <= r) {
    var mid = l + Math.floor ((r - l) / 2)
    var H = 0
    for(let j = 0 ; j < piles.length ; j ++) {
      H += Math.ceil(piles[j] / mid)
    }
    if ( H <= h ) {
      // 符合,试试速度是否可以更小
      r = mid - 1
    } else {
      // 不符合,增加速度
      l = mid + 1
    }
  }
  return l
};