Search in Rotated Sorted Array
Find target in a rotated sorted array of distinct ints — modified binary search on the sorted half.
- dsa
- binary-search
- interview
- Meta
The problem
Array sorted ascending then rotated at an unknown pivot. All values distinct. Return index of target or -1. Must be O(log n).
Input: nums = [4,5,6,7,0,1,2], target = 0
Output: 4
Input: nums = [4,5,6,7,0,1,2], target = 3
Output: -1
Brute force
Linear scan O(n). Violates the log n requirement once stated.
function searchLinear(nums: number[], target: number): number {
return nums.indexOf(target);
}
Optimal: binary search with sorted-half test
At mid, at least one side [lo, mid] or [mid, hi] is strictly sorted (distinct values).
- If
nums[mid] === targetreturn mid. - If left half sorted (
nums[lo] ≤ nums[mid]):- if target in
[nums[lo], nums[mid])→hi = mid - 1 - else →
lo = mid + 1
- if target in
- Else right half sorted:
- if target in
(nums[mid], nums[hi]]→lo = mid + 1 - else →
hi = mid - 1
- if target in
function search(nums: number[], target: number): number {
let lo = 0;
let hi = nums.length - 1;
while (lo <= hi) {
const mid = lo + ((hi - lo) >> 1);
if (nums[mid] === target) return mid;
if (nums[lo] <= nums[mid]) {
// left sorted
if (nums[lo] <= target && target < nums[mid]) hi = mid - 1;
else lo = mid + 1;
} else {
// right sorted
if (nums[mid] < target && target <= nums[hi]) lo = mid + 1;
else hi = mid - 1;
}
}
return -1;
}
| Time | O(log n) |
| Space | O(1) |
Alternative: find pivot then binary search
Two binary searches: min index, then classic search in the correct segment. Same complexity; more code.
Edge cases
- No rotation (already sorted)
- Target is pivot / min element
- Single element
- Target absent
Common bugs
- Using
<vs≤onnums[lo] <= nums[mid]inconsistently - Inclusive bounds wrong on target range checks
- Assuming duplicates (LC 81 needs different handling)
Interview delivery
- Confirm distinct.
- One of two halves always sorted.
- Code carefully with inclusive checks.
- Trace rotated example.
- Mention duplicates variant.
Related
Identify sorted half carefully
With distinct values, nums[lo] <= nums[mid] means [lo..mid] is sorted (including single-element). Equality happens when lo==mid. If duplicates were allowed, this test breaks and you must shrink lo/hi linearly in the worst case.
Trace [4,5,6,7,0,1,2], target 0
- mid points at 7, left sorted 4..7, target not in [4,7) → go right
- eventually mid hits 0 → return
Two-binary-search approach
- Find rotation index (min element) with binary search.
- Binary search target in the correct sorted segment.
Same big-O; more moving parts. Single-pass sorted-half method is tighter.