classSolution:defminEatingSpeed(self, piles: List[int], H:int)->int:# 暴力
K_max =max(piles)for i inrange(1, K_max +1):if self.canEatAll(piles, i)<= H:return i
# 二分法
left, right =1,max(piles)while left +1< right:
mid = left +(right - left)//2if self.canEatAll(piles, mid)<= H:
right = mid
else:
left = mid
if self.canEatAll(piles, left)<= H:return left
return right
defcanEatAll(self, piles, K):
ans =0for pile in piles:
ans +=(pile -1)// K +1return ans
classSolution:"""
@param arr: the map
@return: the smallest target that satisfies from the upper left corner (0, 0) to the lower right corner (n-1, n-1)
"""defmapJump(self, arr):# Write your code here.
self.DIRECTIONS =[[1,0],[-1,0],[0,1],[0,-1]]
left, right =0,100000while left +1< right:print(left, right)
mid = left +(right - left)//2if self.bfs(mid, arr):
right = mid
else:
left =mid
if self.bfs(left, arr):return left
return right
defbfs(self, target, arr):
n, m =len(arr),len(arr[0])
visited =[[0]* m for _ inrange(n)]
deq = collections.deque()
deq.append((0,0))
visited[0][0]=1while deq:
x, y = deq[0][0], deq[0][1]
deq.popleft()if x == n -1and y == m -1:breakfor i inrange(4):
newX = x + self.DIRECTIONS[i][0]
newY = y + self.DIRECTIONS[i][1]if newX <0or newX >= n or newY <0or newY >= m:continueifabs(arr[x][y]- arr[newX][newY])> target or visited[newX][newY]==1:continue
deq.append((newX, newY))
visited[newX][newY]=1return visited[n -1][m -1]==1