思路
- 直觉:选择最大的堆的香蕉数,然后试一下能不能行,如果不行则直接返回上次计算的结果, 如果行,我们减少1个香蕉,试试行不行,依次类推。计算出刚好不行的即可。这种解法的时间复杂度是O(n)。
- 区间【1,最大堆香蕉数】,然后二分查找确定下一次合适的吃香蕉速度。如果全部吃完的时间比规定的少,说明吃得快了,还可以再慢一点,于是区间取二分查找中的小半段
关键点解析
- 二分查找
- 二分查找核心代码:
while(low<=high){ count++; mid=(low+high)/2; cout<<"第"<<count<<"次查找,其中low="<<low<<" high="<<high<<" mid="<<mid<<endl; if(guess==a[mid]){ flag=1; cout<<"success!"<<endl; break;//查找成功,退出 } if(guess>a[mid]){ low=mid+1; } if(guess<a[mid]){ high=mid-1; } }
代码:Python
-
def minEatingSpeed(self, piles, H): low, high = 1, max(piles) while low <= high: K = low + ((high - low) >> 1)#移位操作,相当于除以2 if self.countTimeEatAllAtSpeed(K, piles) <= H: #吃的快了 high = K - 1 else: low = K + 1 return low def countTimeEatAllAtSpeed(self, K, piles): countHours = 0 # hours take to eat all bananas for pile in piles: countHours += pile / K if pile % K != 0: countHours += 1 return countHours