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

How do I run Python on Google Colab using android phone?

Regardless of whether you are an understudy keen on investigating Machine Learning yet battling to direct reproductions on huge datasets, or a specialist playing with ML frantic for extra computational force, Google Colab is the ideal answer for you. Google Colab or "the Colaboratory" is a free cloud administration facilitated by Google to support Machine Learning and Artificial Intelligence research, where frequently the obstruction to learning and achievement is the necessity of gigantic computational force. Table of content- What is google colab? how to use python in google colab? Program to add two strings given by the user. save the file in google colab? What is google colab? You will rapidly learn and utilize Google Colab on the off chance that you know and have utilized Jupyter notebook previously. Colab is fundamentally a free Jupyter notebook climate running completely in the cloud. In particular, Colab doesn't need an arrangement, in addition to the notebook tha...

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...

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...