LeetCode875. Koko Eating Bananas
其他
2020-04-09 21:28:17
阅读次数: 0
思路
- 直觉:选择最大的堆的香蕉数,然后试一下能不能行,如果不行则直接返回上次计算的结果, 如果行,我们减少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
发布了66 篇原创文章 ·
获赞 19 ·
访问量 2万+
转载自blog.csdn.net/RitaAndWakaka/article/details/104953388