Solution 1Two Pointer

class Solution:
    def twoSum(self, numbers: List[int], target: int) -> List[int]:
        left = 0
        right = len(numbers)-1
        while left < right:
            current = numbers[right] + numbers[left]
            if current == target:
                return [left+1, right+1]
            if current > target:
                right -= 1
            else:
                left += 1
        return []
Leet Code/python.py ยท L360โ€“373
public int[] twoSumII(int[] numbers, int target) {
    /* 
     * Change function name from twoSumII to twoSum
    */
    int left = 0;
    int right = numbers.length - 1;
    while (left < right) {
        int current = numbers[left] + numbers[right];
        if (current == target) {
            return new int[] { left + 1, right + 1 };
        }
        if (current > target) {
            right--;
        } else {
            left++;
        }
    }
    return new int[] {};
}
Leet Code/java.java ยท L343โ€“362

Solution 2Binary Search

Classic example of over engineering ๐Ÿ˜‘. Don't follow this!

Python
class Solution:
    def twoSum(self, numbers: List[int], target: int) -> List[int]:
        '''
        Classic example of over engineering ๐Ÿ˜‘. Don't follow this!
        '''
        left = 0
        right = bisect.bisect_right(numbers, target-numbers[left])-1 
        while right > left:
            need = target - numbers[right]
            left = bisect.bisect_left(numbers, need, left, right)
            if numbers[left] == need:
                return [left+1, right+1]
            right = bisect.bisect_right(numbers, target-numbers[left], left, right)-1
        return []
Leet Code/python.py ยท L374โ€“388