LeetCode_167_两数之和2-输入有序数组
廖家龙 用心听,不照做

❗️剑指Offer_57_和为s的两个数字

题目描述:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
若两个指针指向同一数组,遍历方向相同且不会相交,则称为滑动窗口(两个指针包围的区域即为当前的窗口),经常用于区间搜索
若两个指针指向同一数组,但是遍历方向相反,则可以用来进行搜索,待搜索的数组往往是排好序的

指针函数:返回类型是指针的函数
函数指针:指向函数的指针

给定一个已按照 升序排列  的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。

示例:
输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。

输入:numbers = [2,3,4], target = 6
输出:[1,3]

输入:numbers = [-1,0], target = -1
输出:[1,2]

提示:
1. 2 <= numbers.length <= 3 * 10^4
2. -1000 <= numbers[i] <= 1000
3. numbers 按 递增顺序 排列
4. -1000 <= target <= 1000
5. 仅存在一个有效答案

解法1:双指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {

int l = 0,r = numbers.size() - 1; //定义一个左指针,一个右指针
int sum;

//如果两个指针指向元素的和等于给定值,那么它们就是我们要的结果。
//如果两个指针指向元素的和小于给定值,我们就把左指针向右移一位
//如果两个指针指向元素的和大于给定值,我们就把右指针向左移一位
while (l < r) {

sum = numbers[l] + numbers[r];

//对于排好序且有解的数组,双指针一定能遍历到最优解
if (sum == target) break;
if (sum < target) ++l;
else --r;
}

return vector<int>{l + 1,r + 1};
}
};