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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值