利用二分查找最優的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