LeetCode875. Koko Eating Bananas

思路

  • 直觉:选择最大的堆的香蕉数,然后试一下能不能行,如果不行则直接返回上次计算的结果, 如果行,我们减少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