Skip to main content

LeetCode 875 Explained: Koko Eating Bananas Using Binary Search on Answer (Python)

LeetCode 875: Koko Eating Bananas – Binary Search on Answer Explained

LeetCode 875, Koko Eating Bananas, is a classic problem that looks simple at first glance but introduces a powerful and reusable concept: Binary Search on the Answer. In this article, we’ll break down the intuition, approach, and final Python solution step by step.

👉 Full source code is available here: GitHub – LeetCode 875 Solution


🧠 Problem Overview

Koko loves bananas and has h hours to eat all the bananas from multiple piles. She can choose a speed k (bananas per hour) and eats from only one pile per hour. The goal is to find the minimum eating speed that allows her to finish within h hours.

❌ Why Brute Force Fails

A naive approach would be to try every possible eating speed from 1 to max(piles) and check if Koko can finish on time. However, this leads to an inefficient solution with very high time complexity.

💡 Key Insight: Binary Search on the Result

Instead of searching inside the array, we apply binary search on the answer space. The possible eating speeds lie in a fixed range:

  • Minimum speed: 1 banana/hour
  • Maximum speed: max value in piles

If Koko can finish eating all bananas at a certain speed k, then she can also finish at any speed greater than k. This monotonic behavior makes binary search possible.

✅ Feasibility Check Function

For a given speed, we calculate the total hours required to eat all piles. If the total hours are less than or equal to h, the speed is valid.


def caneat(self, piles, mid, h):
    total_time = 0
    for i in piles:
        total_time += i // mid
        if i % mid != 0:
            total_time += 1
    return total_time <= h

    

🔍 Binary Search Implementation

We use binary search to minimize the eating speed while keeping it valid.


def minEatingSpeed(self, piles: List[int], h: int) -> int:
    l = 1
    r = max(piles)

    while l < r:
        mid = (l + r) // 2
        if self.caneat(piles, mid, h):
            r = mid
        else:
            l = mid + 1

    return l

    

⏱️ Time & Space Complexity

  • Time Complexity: O(n log(max(piles)))
  • Space Complexity: O(1)

The binary search reduces the answer space logarithmically, and each feasibility check scans the piles once.

📌 Final Takeaway

This problem teaches a powerful lesson: when the problem asks for a minimum or maximum value and the feasibility behaves monotonically, always consider Binary Search on Answer. Once this pattern clicks, many difficult problems become straightforward.

🔗 Complete solution: View on GitHub

Comments

Popular posts from this blog

LeetCode 88 Explained: Four Approaches, Mistakes, Fixes & the Final Optimal Python Solution

Evolving My Solution to “Merge Sorted Array” A practical, beginner-friendly walkthrough showing four versions of my code (from a naive approach to the optimal in-place two-pointer solution). Includes explanations, complexity and ready-to-paste code. Problem Summary You are given two sorted arrays: nums1 with size m + n (first m are valid) nums2 with size n Goal: Merge nums2 into nums1 in sorted order in-place . Version 1 — Beginner Approach (Extra List) I merged into a new list then copied back. Works, but not in-place and uses extra memory. class Solution: def merge(self, nums1, m, nums2, n): result = [] p1 = 0 p2 = 0 for _ in range(m+n): if p1 >= m: result.extend(nums2[p2:n]) break elif p2 >= n: result.extend(nums1[p1:m]) break elif nu...

Introducing CodeMad: Your Ultimate Universal IDE with Custom Shortcuts

Introducing CodeMad: Your Ultimate Multi-Language IDE with Custom Shortcuts Welcome to the world of CodeMad, your all-in-one Integrated Development Environment (IDE) that simplifies coding and boosts productivity. Developed in Python, CodeMad is designed to make your coding experience smoother and more efficient across a variety of programming languages, including C, C++, Java, Python, and HTML. Whether you're a beginner or an experienced programmer, CodeMad is your go-to tool. In this blog, we'll dive deep into the workings of CodeMad, highlighting its unique features and easy installation process. The Power of Shortcuts CodeMad's intuitive interface is built around a set of powerful keyboard shortcuts that make coding a breeze. Here are some of the key shortcuts you'll find in CodeMad: Copy (Ctrl+C) : Duplicate text with ease. Paste (Ctrl+V) : Quickly insert copied content into your code. Undo (Ctrl+Z) and Redo (Ctrl+Y) : Correct mistakes and s...

Product of Array Except Self in Python | Prefix & Suffix Explained (LeetCode 238)

Problem Overview The Product of Array Except Self is a classic problem that tests your understanding of array traversal and optimization. The task is simple to state but tricky to implement efficiently. Given an integer array nums , you need to return an array such that each element at index i is equal to the product of all the elements in nums except nums[i] . The challenge is that: Division is not allowed The solution must run in O(n) time Initial Thoughts At first glance, it feels natural to compute the total product of the array and divide it by the current element. However, this approach fails because division is forbidden and handling zeroes becomes messy. This pushed me to think differently — instead of excluding the current element, why not multiply everything around it? That’s where the prefix and suffix product pattern comes in. Key Insight: Prefix & Suffix Products For every index i : Prefix product → product of all elements to t...