167. Two Sum II - Input Array Is Sorted
Given a 1-indexed array of integers numbers that is already sorted in non-decreasing order, find two numbers such that they add up to a specific target number. Let these two numbers be numbers[index1] and numbers[index2] where 1 <= index1 < index2 <= numbers.length.
Return the indices of the two numbers, index1 and index2, added by one as an integer array [index1, index2] of length 2.
The tests are generated such that there is exactly one solution. You may not use the same element twice.
Your solution must use only constant extra space.
Example 1:
Example 2:
Example 3:
- 2 <= numbers.length <= 3 * 104
- -1000 <= numbers[i] <= 1000
- numbers is sorted in non-decreasing order.
- -1000 <= target <= 1000
- The tests are generated such that there is exactly one solution.
Constraints:
Notes
Intuition
With a sorted array, we can leverage binary search. For each number, its complement (target - curr) must be in the sorted subarray to its right, making binary search an efficient lookup method.
Implementation
Iterate through the array. For each element, calculate its complement and perform binary search on the elements to the right. If found, return the 1-indexed pair. If not found, continue to the next element.
Edge-cases
The problem guarantees exactly one solution exists, so we don't need to handle the case of no valid pair. Remember to return 1-based indices as required.
- Time: O(n log n) — binary search for each element
- Space: O(1) — only tracking pointers