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

双指针

解题思路

  1. 由于 numbers 是有序数组,则可以定义 leftright 两个指针分别指向数组的头和尾;

  2. numbers[left] + numbers[right] > target 则说明右边在值太大 right--

  3. numbers[left] + numbers[right] < target 则说明左边在值太小 left++

复杂度

  1. 时间复杂度:O(N)

  2. 空间复杂度:O(1)

代码实现

var twoSum = function (numbers, target) {
    let left = 0;
    let right = numbers.length - 1;

    while (left < right) {
        if (numbers[left] + numbers[right] > target) {
            right--;
        } else if (numbers[left] + numbers[right] < target) {
            left++;
        } else {
            return [left + 1, right + 1];
        }
    }
};

二分查找

解题思路

  1. 第一层迭代 固定第一个数 K

  2. 第二层利用 二分查找 查找等于 target - K 的另一个数 M

  3. 停止循环,返回 [K+1、M+1]

复杂度

  1. 时间复杂度:O(nlogn),其中第一层迭代的时间复杂度为 O(n),第二层的二分查找时间复杂度为 O(logn)

  2. 空间复杂度:O(1)

代码实现

var twoSum = function (numbers, target) {
    let left = 0,
        right = numbers.length - 1;

    for (let i = 0; i < numbers.length; i++) {
        left = i + 1;

        while (left <= right) {
            let mid = left + Math.floor((right - left) >> 1);

            if (numbers[i] + numbers[mid] < target) {
                left = mid + 1;
            } else if (numbers[i] + numbers[mid] > target) {
                right = mid - 1;
            } else {
                return [i + 1, mid + 1];
            }
        }
    }
};
打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. 双指针
    1. 1.1. 解题思路
    2. 1.2. 复杂度
    3. 1.3. 代码实现
  2. 2. 二分查找
    1. 2.1. 解题思路
    2. 2.2. 复杂度
    3. 2.3. 代码实现