875. Koko Eating Bananas

1 题目理解

koko是个喜欢吃香蕉的大猩猩。这里有好几堆香蕉,每个小时koko可以取其中一堆香蕉吃。管理员要离开几个小时,koko想在管理员回来之前把香蕉吃完,但是又不想吃得太快。
输入:int数组piles,piles[i]表示第i堆香蕉有几根。第二个输入是H,表示管理员会离开几个小时。
输出:koko可以吃完这些香蕉需要的速度,也就是每小时吃几根香蕉x。
规则:如果速度是4,piles={7,8},那么koko在第1个小时吃4根,第2个小时吃3根。即使后面还有香蕉,但是第2个小时吃的是第0堆香蕉剩下的部分,不可以再吃第1堆香蕉。到第3个小时,koko可以吃第1堆香蕉。

2 二分查找

我们要查找的x是在H个小吃能吃完香蕉的最小值。
g ( x ) = 每 小 时 吃 x 个 , H 小 时 可 以 吃 完 p i l e s 的 所 有 香 蕉 g(x)=每小时吃x个,H小时可以吃完piles的所有香蕉 g(x)=xHpiles
g(x)是一个递增的函数。如果g(m)=true,那么对于x>=m,g(x)一定为true。可以套用模板。

	public int minEatingSpeed(int[] piles, int H) {
        int l = 1;
        int r = l;
        for(int num : piles){
            r = Math.max(r,num);
        }
        while(l<=r){
            int m = l + ((r-l)>>1);
            if(possible(piles,m,H)){
                r = m-1;
            }else{
                l = m+1;
            }
        }
        return l;
    }
    
    private boolean possible(int[] piles,int s,int H){
        int c = 0;
        for(int num : piles){
            c += (num%s==0?num/s:num/s+1);
        }
        return c<=H;
    }

解题方法来源网址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值