力扣167:有序数组的两数之和

121 阅读2分钟

题目描述:

之前我们做了力扣上的第一道两数之和 :无序的

今天我们来做一道167. 两数之和 II - 输入有序数组

image.png image.png

还是先提取信息:

  1. 输入的是有序的数组,已经按照递增排序
  2. 下标从1开始
  3. 返回的是下标
  4. 假设只有唯一的正确答案
  5. 不一定是正整数,范围是-1000 到1000
  6. 不可以使用重复的数
  7. 额外空间要使用常量级别

内容分析:

  • 依然可以使用两数之和的暴力枚举和哈希表的方式求取
    • 但暴力枚举法:没有使用有序这个特质,所以有改进的空间
    • 因为要求额外空间要使用【常量级别】的也就是O(1): 所以排除哈希表方式

解题方式:

暴力枚举法:

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
   参考两数之和

哈希表法:

因为空间复杂度是O(n)所以不符合此题目,但是也可以求取正确的结果

   参考两数之和

双指针:

编程小技巧:看到有序的列表就可以想到双指针试试了

左右指针,相对而行。
左右指针元素相加>目标元素,则将right--,
左右指针元素相加<目标元素,则将left++。
左右指针元素相加==目标元素,则返回结果。
循环停止条件是左指针超过右指针

  • 时间复杂度:O(n)
  • 空间复杂度:O(1):常数个局部变量
var twoSum = function(numbers, target) {
    // 左右指针 
    var left=0;
    var right = numbers.length-1;
    while(left<right){
        var sum = numbers[left] + numbers[right];
        if(sum==target){
            return [left+1, right+1]
        }else if(sum > target){
            right--;
        }else if(sum<target){
            left++;
        }
    }
    return [-1,-1]
};

ok, 这道题你记住双指针这种方式就可以了⭐️

小作业:

三数之和