(二分左端點)愛喫香蕉的珂珂

利用二分查找最優的K,K得到後在計算中也引入二分查找左端點優化計算。

class Solution:
    def left_bound(self,nums, target) :
        # 單側的情況直接返回解
        if target>nums[-1]:
            return len(nums)-1
        if target<nums[0]:
            return -1
        left=0
        right=len(nums)-1
        # [0,len(nums)-1]
        while(left<=right):
            # print(left,right)
            mid=(left+right)//2
            if nums[mid]>=target:
                right=mid-1
                # mid 不可能是解,所以並沒有right在該情況下沒有問題
            elif nums[mid]<target:
                left=mid+1
                # 留下了target = 2 nums[left]=3所以退出while,需要return前擦屁股
        # 檢查越界
        if nums[left]>target:
            left-=1
        return left
    
    def minEatingSpeed(self, piles: List[int], H: int) -> int:
        piles=sorted(piles)
        left=1
        right=piles[-1]
        res=0
        mid=0
        while(left<=right):
            mid=(left+right)//2
            start=self.left_bound(piles,mid)
            res=start+1
            for j in range(start+1,len(piles)):
                if piles[j]%mid==0:
                    res+=piles[j]//mid
                else:
                    res+=piles[j]//mid+1
            if res<=H:
                # left很穩一定是解
                right=mid-1
            elif res>H:
                # left也肯定是解
                left=mid+1 # left就是解
        return left
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章