1. Concept
Unlike classic binary search on arrays, here we are searching for an “answer”. We have:
- A monotonic function 
f(x)(either increasing or decreasing) - A condition we want to satisfy, e.g., 
f(x) >= target - We want the minimum or maximum 
xsatisfying the condition 
Template:
long low = 0, high = 1_000_000_000; // search space
while (low < high) { // note: strict < for answer search
    long mid = low + (high - low) / 2;
    if (check(mid)) high = mid; // condition satisfied, try smaller
    else low = mid + 1;          // condition not satisfied, increase
}
return low; // smallest x satisfying condition
2. Key Tips for Answer Search
- 
Use 
low < highinstead oflow <= high→ Ensures convergence without infinite loop - 
Always check bounds
→ Ensure 
lowandhighcover the full possible answer space - 
Avoid integer overflow
→ 
mid = low + (high - low)/2 - 
Define a 
check(mid)function → Returns true if condition satisfied 
3. Classic Examples
3.1 Koko Eating Bananas
Problem:
Koko can eat k bananas per hour. Given piles and h hours, find minimum k to finish all bananas.
public int minEatingSpeed(int[] piles, int h) {
    int low = 1, high = Arrays.stream(piles).max().getAsInt();
    while (low < high) {
        int mid = low + (high - low) / 2;
        if (canFinish(piles, mid, h)) high = mid; // possible, try smaller
        else low = mid + 1;                        // not enough, increase
    }
    return low;
}
private boolean canFinish(int[] piles, int k, int h) {
    int hours = 0;
    for (int pile : piles) {
        hours += (pile + k - 1) / k; // ceiling division
    }
    return hours <= h;
}
3.2 Capacity to Ship Packages Within D Days
public int shipWithinDays(int[] weights, int D) {
    int low = Arrays.stream(weights).max().getAsInt();
    int high = Arrays.stream(weights).sum();
    while (low < high) {
        int mid = low + (high - low)/2;
        if (canShip(weights, D, mid)) high = mid;
        else low = mid + 1;
    }
    return low;
}
private boolean canShip(int[] weights, int D, int cap) {
    int days = 1, current = 0;
    for (int w : weights) {
        if (current + w > cap) {
            days++;
            current = 0;
        }
        current += w;
    }
    return days <= D;
}
3.3 Minimum Time to Complete Tasks
Problem: You have n workers, each worker takes time[i] per task. Find the minimum time to complete totalTasks.
public long minTime(int[] time, long totalTasks) {
    long low = 1, high = (long)1e18;
    while (low < high) {
        long mid = low + (high - low)/2;
        if (canComplete(time, totalTasks, mid)) high = mid;
        else low = mid + 1;
    }
    return low;
}
private boolean canComplete(int[] time, long totalTasks, long t) {
    long count = 0;
    for (int i : time) {
        count += t / i;
        if (count >= totalTasks) return true;
    }
    return count >= totalTasks;
}
4. Edge Cases
- 
Single-element arrays → check if your 
lowandhighcover all possibilities - 
Very large numbers → always use 
longfor sum/multiplication - 
Strict inequality → choose 
<or<=carefully inwhileloop - 
Ceiling division → 
(x + y - 1)/yfor integer math 
5. Problems to Practice
- LeetCode 875: Koko Eating Bananas
 - LeetCode 1011: Capacity to Ship Packages Within D Days
 - LeetCode 774: Minimize Max Distance to Gas Station
 - LeetCode 275: H-Index II
 - Binary search on “minimize/maximize” problems
 
✅ Blog 2 Summary:
We learned how to apply binary search on answers rather than array elements:
- Monotonic functions
 - “Check” function pattern
 - Minimize / maximize patterns
 - Koko eating bananas, ship packages, minimum time tasks
 
Next in Series — Blog 3
Binary Search on Rotated & Special Arrays:
- Rotated sorted arrays with or without duplicates
 - Bitonic / mountain arrays
 - Pivot search patterns
 - Java code with diagrams and examples
 
    
Top comments (0)