Modified Binary Search Pattern
Modified Binary Search adapts the classic logarithmic search to inputs that are sorted-then-rotated, infinite, two-dimensional, or organized around an answer-space rather than a literal value. It compresses an O(n) scan into O(log n) by halving the search range on every iteration, using O(1) space.
By Sam K., Founder, InterviewChamp.AI · Last verified
Complexity
- Time
- O(log n)
- Space
- O(1)
When to use Modified Binary Search
- The input is sorted but rotated, or has a single "pivot" or peak you need to locate.
- The input is sorted but you don't know its length up front (infinite array problems).
- The input is a 2D matrix whose rows and/or columns are sorted.
- You are searching over an answer-space ("smallest k that satisfies P") and P is monotonic in k.
- You need to find the leftmost or rightmost occurrence of a value in a sorted array with duplicates.
Template
function binarySearch(nums, target) {
let left = 0;
let right = nums.length - 1;
while (left <= right) {
const mid = left + Math.floor((right - left) / 2);
if (nums[mid] === target) {
return mid;
} else if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}Example LeetCode problems
| # | Problem | Difficulty | Frequency |
|---|---|---|---|
| 704 | Binary Search | easy | foundational |
| 33 | Search in Rotated Sorted Array | medium | company favorite |
| 153 | Find Minimum in Rotated Sorted Array | medium | frequently asked |
| 34 | Find First and Last Position of Element in Sorted Array | medium | frequently asked |
| 74 | Search a 2D Matrix | medium | classic |
| 162 | Find Peak Element | medium | frequently asked |
| 875 | Koko Eating Bananas | medium | company favorite |
| 1011 | Capacity To Ship Packages Within D Days | medium | company favorite |
| 4 | Median of Two Sorted Arrays | hard | company favorite |
Common mistakes
- Computing `mid = (left + right) / 2` and overflowing on 32-bit integers; use `left + (right - left) / 2` instead.
- Using `left < right` vs `left <= right` without matching the rest of the loop — the two styles produce subtly different post-conditions.
- On rotated arrays, deciding which half is sorted using the wrong comparison and recursing into the unsorted half.
- Forgetting to update `left` or `right` to `mid` (instead of `mid + 1` / `mid - 1`) in answer-space searches, causing infinite loops.
- Returning the index instead of the value (or vice versa) on the recursive-base case.
Frequently asked questions
What is the difference between binary search on values and binary search on an answer space?
Value search looks up an exact element in a sorted array. Answer-space search picks a candidate answer k, evaluates a monotonic predicate P(k), and narrows the range based on whether P held. Examples: minimum eating speed, minimum ship capacity, maximum splitting size.
How do I find the leftmost vs rightmost occurrence of a value?
Run binary search but never return on equality. For leftmost, move `right` to `mid - 1` when `nums[mid] >= target` and remember the candidate. For rightmost, move `left` to `mid + 1` when `nums[mid] <= target`.
Why is binary search relevant to a 2D matrix?
If the matrix is fully sorted (each row sorted and the first element of each row greater than the last element of the previous row), you can treat it as a flattened sorted array of length m*n. If only rows and columns are sorted, you instead start from a corner and step row/column based on comparisons.
When should I prefer binary search over linear search?
Whenever the input is sorted (or sortable as a one-time cost) and the comparison cost is cheap. Binary search wins on inputs of size 100 or more; below that the constant factors of linear scan are usually faster.
Solve it now
Free. No sign-up. Python and JavaScript run instantly in your browser.