class Solution: def minEatingSpeed(self, piles: List[int], h: int) -> int: l, r = 1, max(piles) min_k = r while l <= r: mid = l + (r - l) // 2 if self.can_eat_within(h, piles, mid): min_k = min(mid, min_k) r = mid - 1 else: l = mid + 1 return min_k def can_eat_within(self, h, piles, k): total = reduce(lambda total, count: total + ceil(count / k), piles, 0) return total <= h Complexity Time: O(nlog(max(piles))) Space: O(1)