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:
Space: