算法题:167. 两数之和 II - 输入有序数组

思路

这题跟《算法题:1. 两数之和》很像,而且那题的解法也可以用于解答这题。不过由于这题的数组是排好序的,所以有更优解。

双指针

function twoSum(numbers: number[], target: number): number[] {
    let left = 0;
    let right = numbers.length - 1;
    while(left < right){
        const sum = numbers[left] + numbers[right];
        if(sum === target){
            return [left + 1, right + 1];
        } else if(sum < target){
            left++;
        } else {
            right--;
        }

    }
    return [];
};

二分查找

function twoSum(numbers: number[], target: number): number[] {
    let left = 0;
    let right = 0;
    let mid = 0;
    let sum = 0;
    for(let i = 0; i < numbers.length; i++) {
        left = i + 1;
        right = numbers.length - 1;
    
        while(left <= right){
            mid = ~~((right - left) / 2) + left;
            sum = numbers[mid] + numbers[i];
            if(target === sum){
                return [i + 1, mid + 1];
            }
            if(sum > target){
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        
    }
    return [];
};

总结


从结果可以看出:除了暴力枚举外,其他几种解法性能相差不大。不过可能是测试用例不多,不然map和双指针的o(n)会比二分查找的n(nlogn)快,而且双指针又比map省空间才对。

评论

0 / 800
全部评论()