875-koko-eating-bananas

Try it on leetcode

Description

Koko loves to eat bananas. There are n piles of bananas, the ith pile has piles[i] bananas. The guards have gone and will come back in h hours.

Koko can decide her bananas-per-hour eating speed of k. Each hour, she chooses some pile of bananas and eats k bananas from that pile. If the pile has less than k bananas, she eats all of them instead and will not eat any more bananas during this hour.

Koko likes to eat slowly but still wants to finish eating all the bananas before the guards return.

Return the minimum integer k such that she can eat all the bananas within h hours.

 

Example 1:

Input: piles = [3,6,7,11], h = 8
Output: 4

Example 2:

Input: piles = [30,11,23,4,20], h = 5
Output: 30

Example 3:

Input: piles = [30,11,23,4,20], h = 6
Output: 23

 

Constraints:

  • 1 <= piles.length <= 104
  • piles.length <= h <= 109
  • 1 <= piles[i] <= 109

Solution(Python)

class Solution:
    def minEatingSpeed(self, piles: List[int], h: int) -> int:
        return self.binarySearch(piles, h)

    # minimum possible speed will be 1
    # maximum possible speed will be m largest pile size
    # which gives us range
    # then try every possible speed values starting from lowest speed
    # until condition is met
    #
    # Time Complexity: O(mn)
    # Space Complexity: O(1)
    def bruteforce(self, piles: List[int], h: int) -> int:
        speed = 1

        while True:
            hour_spend = 0
            for pile in piles:
                hour_spent += ceil(pile / speed)
            if hour_spent <= h:
                return speed
            else:
                speed += 1

    # since bruteforce searches on the range of increasing list
    # binary search will halves the  search space by log m
    #
    # binary search control relies on finding the condition of spearater
    # line between the search space
    # if x banana per second satisfies means x+1 banana per second also
    # satisfies the time criteria so ignore x+1
    # if x bps doesnot satifies then ignore x-1
    # Time Complexity: O(nlogM)
    # Space Complexity:O(1)
    def binarySearch(self, piles: List[int], h: int) -> int:
        left = 1
        right = max(piles)

        while left < right:
            mid = (left + right) // 2
            hour_spend = 0
            for pile in piles:
                hour_spend += ceil(pile / mid)

            if hour_spend <= h:
                right = mid
            else:
                left = mid + 1
        return left