--- title: '875. Koko Eating Bananas' description: Koko loves to eat bananas. There are n piles of bananas, the i^th pile has piles[i] bananas. The guards have gone and will come back in h hours icon: dot topics: - { name: "Array", slug: "array" } - { name: "Binary Search", slug: "binary-search" } video: "U2SozAs9RzA" issue: "https://github.com/prdlk/leetcode/issues/59" sidebar: label: 'Koko Eating Bananas' badge: 'Medium' --- ### 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 <= 10^4` - `piles.length <= h <= 10^9` - `1 <= piles[i] <= 10^9` ## Approach ```mermaid flowchart TD S(["minEatingSpeed(piles, h)"]) --> I["l = 1, r = max(piles)"] I --> W{"l < r?"} W -- no --> E(["return l — the smallest workable speed"]) W -- yes --> M["mid = floor((l + r) / 2)"] M --> K["kWorks(mid): hours = sum of ceil(p / mid)"] K --> Q{"hours <= h?"} Q -- yes --> A["r = mid — keep mid, try slower"] Q -- no --> B["l = mid + 1 — too slow, speed up"] A --> W B --> W ``` ## Solution ```js /** * @param {number[]} piles * @param {number} h * @return {number} */ var minEatingSpeed = function(piles, h) { // Function to determine if K works for the H function kWorks(k){ let hours = 0; for (let p of piles){ hours += Math.ceil(p/k) } return hours <= h; } // Setup Binary Search let l = 1; let r = Math.max(...piles); // Find the K value which works for H and consumes all bananas while (l < r){ const mid = Math.floor((l + r) / 2); if (kWorks(mid)){ r = mid; }else{ l = mid + 1; } } return l; }; ```