目录
一、题目描述
二 、整体思路
三 、代码
一、题目描述
原题地址
二 、整体思路
题目要求在时间h内(含h),求解最小速度k。那么首先要知道速度与吃香蕉所用时间的关系。
假设速度为k,那么吃香蕉所用时间t就等于每堆香蕉piles[i]除以速度k所得的向上取整的商之和。
即。
下一步,找出最小的k。同时发现k的上限是max(piles[i]),下限是1。根据上述公式发现k与t存在单调性。因此可以用二分搜索,找出>=h对应的速度的k的最小值。具体来说就是k对应的时间t=h时,要让k尽量小。k对应的时间t<=h时,说明mid值可能为答案,要保留,同时继续寻找潜在的比mid更小的k即r=mid。k对应的时间t>h时,说明当前吃香蕉速度k不够大,因此l=mid+1。
三 、代码
class Solution {
public int minEatingSpeed(int[] piles, int h) {
int l=1,r=0;
for(int pile:piles){
r=Math.max(pile,r);
}
//求解>=h对应的speed的最小值
while(l<r){
int mid=l+(r-l)/2;
if(eatingtime(mid,piles)<=h) r=mid;
else l=mid+1;
}
return l;
}
public int eatingtime(int k,int[] piles){
int ans=0;
for(int i=0;i<piles.length;i++){
ans+=(piles[i]-1)/k+1;
}
return ans;
}
}