167. 两数之和II-输入有序数组


二分查找法

class Solution {
    public int[] twoSum(int[] numbers, int target) {

        int[] res = new int[2];

        /**
         * 对于每一个元素,在后面的子数组中寻找是否有匹配的元素
         * 因为数组是有序的,使用二分查找法寻找更快
         * 该数组索引是从1开始的,最终返回值要加1
         */
        for (int i = 0; i < numbers.length - 1; i++) {

            int index = binarySearch(numbers, i + 1, numbers.length - 1, target - numbers[i]);

            if (index != -1){

                res[0] = i + 1;
                res[1] = index + 1;
                break;
            };
        }

        return res;
    }

    public int binarySearch(int[] arr, int left, int right, int value){

        if (left > right){
            return -1;
        }

        int mid = left + (right - left) / 2;

        if (arr[mid] == value){
            return mid;
        }
        else if (arr[mid] < value){
            return binarySearch(arr, mid + 1, right, value);
        }
        else {
            return binarySearch(arr, left, mid - 1, value);
        }
    }
}

/**
 * 时间复杂度 O(nlogn)
 * 空间复杂度 O(1)
 */

优化1——双指针法

class Solution {
    public int[] twoSum(int[] numbers, int target) {

        /**
         * 双指针遍历数组
         * 最大值和最小值相加,如果和大与目标值,右指针左移,反之左指针右移
         */
        int i = 0;
        int j = numbers.length - 1;
        int[] res = new int[2];

        while (i < j){

            if (numbers[i] + numbers[j] == target){

                res[0] = i + 1;
                res[1] = j + 1;
                break;
            }
            else if (numbers[i] + numbers[j] > target){
                j--;
            }
            else {
                i++;
            }
        }

        return res;
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted/