遇到一个面试题,其实 和 LeetCode 875 是一个题。下图是该面试题:
下边代码是该题的两种解法,暴力求解会超时。
import math
from typing import List
class Solution:
# 方法一: 暴力遍历
def minEatingSpeed0(self, piles: List[int], h: int) -> int:
for k in range(math.ceil(sum(piles) / h), max(piles) + 1):
xDk = [math.ceil(xx / k) for xx in piles]
if sum(xDk) == h:
return k
# 方法二:二分查找
def minEatingSpeed(self, piles: List[int], h: int) -> int:
if h == len(piles):
return max(piles)
l, r = math.ceil(sum(piles) / h), max(piles) + 1
while l < r:
m = l + (r - l) // 2
if self.canFinish(piles, m, h):
r = m
else:
l = m + 1
return l
def canFinish(self, piles, speed, H):
t = 0
for e in piles:
t += self.timeOf(e, speed)
return t <= H
def timeOf(self, n, speed):
return math.ceil(n / speed)
if __name__ == "__main__":
X, H = [30, 20, 23, 4, 11], 10
s = Solution()
res = s.minEatingSpeed(X, H)
print(res)