Two Sum II. Input Array Is Sorted
Problem (restated)
Given a 1-indexed sorted array of integers, find two numbers that add up to target. Return their 1-based indices. Exactly one solution exists.
Intuition
Sorted order lets the larger end decrease the sum and the smaller end increase it. one pass from both ends.
Approaches
Two pointers from ends
Tested onlyIdea. lo at start, hi at end. If sum too small, lo++. If too large, hi–. Else return 1-based indices.
Walkthrough. numbers=[2,7,11,15], target=9 → 2+15 too big, 2+11 too big, 2+7=9 → [1,2].
Trade-offs. Faster than hash map when input is sorted and constant extra space is required.
export function twoSum(numbers: number[], target: number): number[] {
let lo = 0, hi = numbers.length - 1;
while (lo < hi) {
const s = numbers[lo]! + numbers[hi]!;
if (s === target) return [lo + 1, hi + 1];
if (s < target) lo++;
else hi--;
}
return [-1, -1];
}
export function twoSum(numbers: number[], target: number): number[] {
let lo = 0, hi = numbers.length - 1;
while (lo < hi) {
const s = numbers[lo]! + numbers[hi]!;
if (s === target) return [lo + 1, hi + 1];
if (s < target) lo++;
else hi--;
}
return [-1, -1];
}
Reflection
- Which cue made you pick this pattern in under 90 seconds?
- What input would break a wrong invariant?