题目描述:
之前我们做了力扣上的第一道两数之和 :无序的
今天我们来做一道167. 两数之和 II - 输入有序数组
还是先提取信息:
- 输入的是有序的数组,已经按照递增排序
- 下标从1开始
- 返回的是下标
- 假设只有唯一的正确答案
- 不一定是正整数,范围是-1000 到1000
- 不可以使用重复的数
- 额外空间要使用常量级别的
内容分析:
- 依然可以使用两数之和的暴力枚举和哈希表的方式求取
- 但暴力枚举法:没有使用有序这个特质,所以有改进的空间
- 因为要求额外空间要使用【常量级别】的也就是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, 这道题你记住双指针这种方式就可以了⭐️