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)=每小时吃x个,H小时可以吃完piles的所有香蕉
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;
}
解题方法来源网址