You've probably learned basic binary search on a sorted array. But then you see an editorial saying:
“This problem can be solved using binary search on answer.”
There’s no sorted array in sight. The inputs are just numbers, constraints, and some abstract condition. For many beginners, this phrase might as well be magic.
This guide breaks down binary search on answer in LeetCode for beginners: what it really means, when it works, how to recognize it, and how to implement it with a reusable template.
TL;DR
- Binary search on answer means searching over the range of possible answers instead of indices of a sorted array.
- It applies when you can test “Is there a valid solution with value ≤ X?” and that condition is monotonic (once true, it stays true, or once false, it stays false).
- The core steps: define the answer range, write a predicate
can(x)that checks feasibility, then binary search the smallest (or largest)xthat satisfies it. - Beginners often get stuck choosing the correct search range, writing an incorrect
can(x), or using the wrong mid update when searching for minimum vs maximum. - With a simple template, visual diagrams, and practice on classic problems, binary search on answer becomes another tool in your pattern toolbox instead of a mysterious trick.
Beginner-Friendly Explanation: What Are We Searching Over?
Classic binary search:
- Input: sorted array
nums. - Goal: find a target value or insertion position.
- Search space: indices
[0, n-1]or values in the array.
Binary search on answer:
- Input: constraints + feasibility check (e.g., can we ship packages within
Ddays?). - Goal: minimize or maximize some numeric answer (speed, capacity, time, etc.).
- Search space: possible answers, e.g., speed
v ∈ [1, max(piles)].
You never binary search the original array. Instead, you:
- Guess a candidate answer
mid. - Check whether it’s possible to satisfy the problem constraints with that answer.
- Shrink the range based on the result.
The key requirement is monotonicity:
If
can(x)is true, then all “easier” values should also be true (or all “harder” values should be false).
Example patterns:
- Minimum speed to finish in time → if you can finish at speed
v, you can also finish at any faster speed. - Minimum capacity to ship packages in
Ddays → if capacity `C) works, any larger capacity also works. - Minimum largest subarray sum after splitting → if you can split with max sum
S), any largerS) is also feasible.
Step-by-Step: General Template for Binary Search on Answer
1. Define the answer and range
Ask:
- “What numeric value am I optimizing?”
- “What are the smallest and largest possible values?”
Examples:
- Speed:
v ∈ [1, max(piles)]. - Capacity:
C ∈ [max(weights), sum(weights)]. - Time:
T ∈ [0, upperBound].
2. Write a feasibility check `can(x)`
can(x) answers:
“Is it possible to satisfy the problem with answer
x?”
This function usually:
- Simulates a greedy process.
- Counts how many days/machines/workers you’d need if the answer is
x. - Returns
trueif you meet the constraints, otherwisefalse.
3. Decide which side to move on
For “minimize the smallest good value” problems:
- If
can(mid)is true → we can try a smaller answer (move right boundary left). - If
can(mid)is false → we need a larger answer (move left boundary right).
For “maximize the largest good value” problems, the logic flips.
4. Implement the binary search loop
Use a standard loop:
function binarySearchOnAnswer(low: number, high: number): number {
while (low < high) {
const mid = Math.floor((low + high) / 2);
if (can(mid)) {
high = mid; // mid might be the answer, try smaller
} else {
low = mid + 1; // mid too small, need larger
}
}
return low; // or high; they are equal here
}The implementation details live in can(mid).
Visual Example: Minimum Eating Speed
Consider a classic pattern:
Given piles of bananas and hours
H, find the minimum eating speedk) so all piles are eaten withinH` hours.
You don’t binary search the piles. You search over possible speeds.
Visualizing the search
Speed range: [1, maxPile]
1 2 3 4 5 6 ... maxPile
|---|---|---|---|---|--- ... ----|
L R
We want the smallest k such that canFinish(k) == trueThe predicate:
canFinish(k): simulate eating at speedk) and check if total hours ≤H`.
We rely on monotonicity:
- If you can finish at speed
k), then any speed >k) will also finish in time. - So once we find a true `k), all speeds to the right are also true.
Code Example: Binary Search on Answer Template in TypeScript
Here’s a concrete example using the banana piles problem:
function minEatingSpeed(piles: number[], h: number): number {
let low = 1;
let high = Math.max(...piles);
function can(speed: number): boolean {
let hours = 0;
for (const pile of piles) {
// ceil(pile / speed)
hours += Math.floor((pile + speed - 1) / speed);
if (hours > h) return false; // early exit if already too slow
}
return hours <= h;
}
while (low < high) {
const mid = Math.floor((low + high) / 2);
if (can(mid)) {
high = mid; // mid works, try smaller
} else {
low = mid + 1; // mid too small, need faster speed
}
}
return low;
}Key points:
- We search
[1, maxPile]. can(speed)) is monotonic: if speedv) works, any speed > `v) also works.- We return the smallest speed that still works.
Practical Preparation Strategies
1. Learn to spot the pattern from the statement
Signals that binary search on answer might apply:
- “Minimize maximum …” or “maximize minimum …”.
- Time, speed, capacity, or threshold being optimized.
- You can write a check: “Is there a valid solution if the answer is
X?”
When you see these, consider whether you can:
- Define an answer range.
- Write a monotonic
can(x).
2. Start with brute force thinking
Before jumping into the template:
- Think: “If I knew the answer
x, how could I check it?” - Write that feasibility check first.
- Only then wrap it in a binary search.
This keeps you from memorizing a template without understanding.
3. Practice with a small curated set
Pick 4–6 problems that use this pattern:
- Minimum speed / capacity / time.
- Splitting arrays into subarrays with constraints.
- Minimizing the largest group sum / cost.
Use a structured DSA learning path and tag these as “binary-search-on-answer” in your notes so you can review them before interviews.
4. Use tools for step-by-step reasoning
When you’re unsure, tools like LeetCopilot can support you by walking through your can(x) logic and suggesting test cases that break monotonicity, instead of just giving you the final code.
Common Mistakes to Avoid
Mistake 1: Wrong answer range
If your range is too narrow, you’ll miss the real answer. If it’s too wide, your can(x) might overflow or misbehave.
Fix: Derive bounds carefully from constraints:
- Lower bound often equals a minimum feasible value (e.g.,
max(weights)). - Upper bound often equals a worst-case sum or max constraint (e.g.,
sum(weights)).
Mistake 2: Non-monotonic predicate
If can(x) flips between true and false multiple times, binary search breaks.
Fix: Double-check that:
- If
can(x)is true, thencan(x+1)is also true (for min problems), or - If
can(x)is false, thencan(x-1)is also false (for max problems).
If that’s not true, binary search on answer is the wrong tool.
Mistake 3: Off-by-one boundaries
Classic issues:
- Using
while (low <= high)but returning the wrong bound. - Not clear whether you’re finding “first true” or “last true”.
Fix: Commit to a convention:
- For “first true”, use
while (low < high)and returnlow. - Write down in comments which variant you’re using.
Mistake 4: Overcomplicating `can(x)`
Beginners sometimes pack extra logic into can(x) instead of keeping it a simple feasibility check.
Fix: Let can(x) answer exactly one question: “Is x feasible?” Keep scoring / storing the final answer outside in the main loop.
FAQ
Q1: How do I know when to use binary search on answer vs DP or greedy?
Look for a numeric answer and a natural yes/no question like “Can we do it with X?” If you can write a monotonic feasibility check, try binary search on answer. If the state seems multi-dimensional or non-monotonic, DP or greedy might be better.
Q2: Do I need a sorted array for this?
No. The “sorted” concept lives in the answer space: once can(x) is true, all larger (or smaller) answers are also true. That’s the sorted property you need.
Q3: Is this the same as parametric search?
Yes, “parametric search” is another name for the same idea: searching over possible parameter values using a monotonic predicate.
Q4: How can I practice this pattern specifically?
Gather 5–7 LeetCode problems tagged with “binary search” that also optimize a numeric answer. Solve them in a cluster, reusing the same template. Tools that offer AI-guided LeetCode practice can help you by nudging you toward this pattern without spoiling the full solution.
Q5: What if my can(x) is too slow?
Sometimes can(x) itself needs optimization (e.g., from O(n²) to O(n)). Start with a simple version for understanding, then profile and optimize it as needed—your time complexity will often be O(log R * cost(can)), where R is the answer range.
Conclusion
Binary search on answer in LeetCode is not a separate algorithm; it’s a way of turning optimization problems into search problems over a numeric range.
The core ideas:
- Identify a numeric answer and its bounds.
- Write a monotonic feasibility check
can(x). - Use a consistent binary search template to find the smallest or largest good
x.
With deliberate practice and structured notes, this pattern becomes another reliable part of your toolkit. Instead of feeling like a clever editorial trick, binary search on answer turns into a predictable strategy you can deploy confidently in coding interviews.
Want to Practice LeetCode Smarter?
LeetCopilot is a free browser extension that enhances your LeetCode practice with AI-powered hints, personalized study notes, and realistic mock interviews — all designed to accelerate your coding interview preparation.
Also compatible with Edge, Brave, and Opera
