【二分查找】 875. 爱吃香蕉的珂珂

875. 爱吃香蕉的珂珂

解题思路

  • 每一堆香蕉都是相互独立的 一个小时内吃不完一堆香蕉 必须再花费一个小时吃
  • 所以每一堆香蕉的耗时就是 piles[i] / k 向上取整
  • k是吃香蕉的速度 min:每小时最少吃一根 max :最多全部吃完一组
  • 在min和max之间二分k 找到最低的满足速度
  • 如果计算的time小于h 说明吃得快 可以在慢一点 将上边界为time
  • 如果计算的time大于h 说明慢了 将下边界为time

class Solution {
    public int minEatingSpeed(int[] piles, int h) {
        // 每一堆香蕉都是相互独立的  一个小时内吃不完一堆香蕉  必须再花费一个小时吃
        // 所以每一堆香蕉的耗时就是 piles[i] / k 向上取整

        // k是吃香蕉的速度  min:每小时最少吃一根  max :最多全部吃完一组
        //在min和max之间二分k   找到最低的满足速度  
        // 如果计算的time小于h 说明吃得快 可以在慢一点 将上边界为time
        // 如果计算的time大于h  说明慢了  将下边界为time

        int low = 1;// 最慢的速度
        int high =  Arrays.stream(piles).max().getAsInt();// 最快的速度
        

        while(low < high){

            // 计算中间速度
            int mid = (high - low) / 2 + low;

            // 计算时间
            long time = 0;
            for(int pile:piles){
                time += (pile + mid  - 1) /mid;
            }

            if(time <= h){
                // 说明速度快  需要慢一点 
                high = mid;
            }else {
                low = mid + 1;
            }
        }

        return high;
        

    }
}

你可能感兴趣的:(#,Leetcode,数据结构,java)