Binary Search on Answer Technique in DSA Javascript - Time & Space Complexity
We want to understand how the time taken by the binary search on answer technique changes as the input size grows.
Specifically, how many steps does it take to find the correct answer by narrowing down the search space?
Analyze the time complexity of the following code snippet.
function binarySearchOnAnswer(low, high, condition) {
while (low <= high) {
const mid = Math.floor((low + high) / 2);
if (condition(mid)) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return low;
}
This code tries to find the smallest value that satisfies a condition by repeatedly checking the middle value and narrowing the search range.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The while loop that halves the search range each time.
- How many times: The loop runs until the search range is empty, roughly halving the range each step.
Each step cuts the search space in half, so the number of steps grows slowly even if the input range grows a lot.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 4 steps |
| 100 | About 7 steps |
| 1000 | About 10 steps |
Pattern observation: Doubling the input size adds only one extra step, showing very slow growth.
Time Complexity: O(log n)
This means the number of steps grows slowly, increasing by one step each time the input size doubles.
[X] Wrong: "The loop runs n times because it checks every number between low and high."
[OK] Correct: The loop does not check every number; it halves the search space each time, so it runs much fewer times than n.
Understanding this technique shows you can efficiently find answers in large search spaces by smartly narrowing down options, a valuable skill in problem solving.
"What if the condition function takes linear time to check each mid? How would that affect the overall time complexity?"
Practice
Binary Search on Answer technique?Solution
Step 1: Understand the technique's goal
Binary Search on Answer guesses a possible answer and checks if it meets the problem's conditions.Step 2: Use binary search on the answer range
We narrow down the answer by checking mid-values until we find the smallest or largest valid answer.Final Answer:
We guess an answer and use binary search to find the smallest or largest valid value. -> Option AQuick Check:
Binary Search on Answer = Guess and check with binary search [OK]
- Confusing it with normal binary search on sorted arrays
- Trying to binary search elements instead of answer values
- Not defining a valid check function for guesses
low to high?Solution
Step 1: Identify the binary search loop structure
Binary search uses a while loop checking low <= high to continue searching.Step 2: Calculate mid correctly
Mid is calculated as Math.floor((low + high) / 2) to get the middle integer index.Final Answer:
while (low <= high) { let mid = Math.floor((low + high) / 2); } -> Option BQuick Check:
Correct binary search loop syntax = while (low <= high) { let mid = Math.floor((low + high) / 2); } [OK]
- Using for loop instead of while for binary search
- Not flooring mid value causing float indices
- Using incorrect loop conditions like low < high
function canShip(weights, capacity, D) {
let days = 1, currentLoad = 0;
for (let w of weights) {
if (currentLoad + w > capacity) {
days++;
currentLoad = 0;
}
currentLoad += w;
}
return days <= D;
}
function shipWithinDays(weights, D) {
let low = Math.max(...weights);
let high = weights.reduce((a, b) => a + b, 0);
while (low < high) {
let mid = Math.floor((low + high) / 2);
if (canShip(weights, mid, D)) {
high = mid;
} else {
low = mid + 1;
}
}
return low;
}
console.log(shipWithinDays([1,2,3,4,5,6,7,8,9,10], 5));What is the output of this code?Solution
Step 1: Understand the problem and code
The code finds the minimum ship capacity to ship weights in 5 days. It uses binary search between max weight (10) and sum (55).Step 2: Trace binary search narrowing
Checking mid values, the minimum capacity that allows shipping in 5 days is 15.Final Answer:
15 -> Option CQuick Check:
Minimum capacity to ship in 5 days = 15 [OK]
- Choosing max weight (10) as answer instead of minimum capacity
- Choosing total sum (55) instead of minimum valid capacity
- Misunderstanding the days condition in canShip
k pieces using binary search on answer. Find the bug:function maxLength(ropes, k) {
let low = 0;
let high = Math.max(...ropes);
while (low <= high) {
let mid = Math.floor((low + high) / 2);
let count = 0;
for (let r of ropes) {
count += Math.floor(r / mid);
}
if (count >= k) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return high;
}Solution
Step 1: Identify potential division by zero
Starting low at 0 means mid can be 0, causing division by zero in Math.floor(r / mid).Step 2: Fix low initialization
Set low to 1 to avoid division by zero and ensure valid rope length guesses.Final Answer:
Starting low from 0 causes division by zero error. -> Option DQuick Check:
low = 0 causes divide by zero [OK]
- Ignoring division by zero possibility
- Changing loop condition unnecessarily
- Returning wrong boundary without reason
k workers, where each worker can do consecutive tasks only. Given task times array tasks, how would you apply binary search on answer to solve this?Choose the best approach:
Solution
Step 1: Define the answer range
The minimum max time is at least max task time, max is sum of all tasks.Step 2: Check feasibility with mid value
Check if tasks can be split into ≤ k groups where each group's sum ≤ mid.Step 3: Use binary search to narrow answer
Adjust low and high based on feasibility until minimum max time is found.Final Answer:
Binary search on time range; check if tasks can be split into ≤ k groups with max sum ≤ mid. -> Option AQuick Check:
Binary search on max time with group feasibility check [OK]
- Binary searching on tasks count instead of time
- Ignoring consecutive task grouping constraint
- Sorting tasks unnecessarily
Ready to prove it?
Pass the test and this pattern moves unknown
