# 167.两数之和 II - 输入有序数组
# 题目
https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted/
# 思路
使用双指针,左指针指向第一个元素,右指针指向最后一个元素
- 如果两个指针指向元素的和sum==target,那么得到要求的结果;
- 如果sum<target,移动较小的元素,使 sumsum 变大一些。
- 如果sum>target,移动较大的元素,使sum变小一些;
复杂度:
数组中的元素最多遍历一次,时间复杂度为 O(N)。只使用了两个额外变量,空间复杂度为 O(1)。
# 代码
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int left = 0;
int right = numbers.size()-1;
while(left<right){
int two_sum = numbers[left] + numbers[right];
if (two_sum==target){
return {left+1,right+1};
}else if(two_sum<target){
left++;
}else{
right--;
}
}
return {};
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
此题中双指针往中间移动时,为何不会漏掉某种情况?一张图解释: