---
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
sidebar:
  label: 'Koko Eating Bananas'
  badge: 'Medium'
---

Array

### 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;
};
```

## Explanation

[Koko Eating Bananas - Binary Search - Leetcode 875 - Python](https://www.youtube.com/watch?v=U2SozAs9RzA)
