速度越大肯定在规定的时间之内一定会吃完全部的香蕉,但也是可以确定出一个上界的。由于只要保证一小时之内,可以吃完香蕉数目最多的那一堆的香蕉,那么其他数目更小的香蕉在1小时之内肯定都是可以吃完的,那么 k 的最大值就是数组的最大值。
k 肯定不为 0,又是整数,确定其最小值为 1.
k ∈ [1, max_pile]
采用二分查找进行寻找 k 的最小值。
三、代码
classSolution{publicintminEatingSpeed(int[] piles,int h){int n = piles.length;// 确定 k 的搜索范围int l =1, r =0;for(int pile : piles){// 找到香蕉数量最多的为 k 的最大值
r =Math.max(r, pile);}// 范围内进行二分查找while(l <= r){int mid = l +(r - l)/2;if(check(piles, h, mid)){// 检查当前速度 k 是否能够在规定时间 h 内将全部香蕉吃完
r = mid -1;// 能吃完说明当前 k 较大,收缩右边界}else{
l = mid +1;// 不能吃完说明当前 k 较小,收缩左边界}}return l;}publicbooleancheck(int[] piles,int h,int mid){int sum = piles.length;for(int pile : piles){
sum +=(pile -1)/ mid;if(sum > h){returnfalse;}}returntrue;}}