题目1:
指路:
思路与分析:
在一个数组中找到两个数使其和为给定的目标值。我们首先考虑双指针的思路,因为给出的数组为非递减因此我们无需排序直接定义指向即可。定义一个左指针指向数组的首元素,一个右指针指向数组的尾元素,当左右指针有效时,保存当前得到的现有值,也就是两个指针对应在数组中的和,之后,这里又分为三种情况。其一为得到的和与目标值相等,那么直接返回左右指针+1,注意:这里不是返回左右指针,因为给出的下标从1开始而非0,而样例中的[1, 2]和[1, 3]也很好地证明了这一点。
代码:
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int n = numbers.size();
int left = 0, right = n - 1;
while (left < right) {
// 得到现有的匹配值
int match = numbers[left] + numbers[right];
if (match == target) {
return {left + 1, right + 1};
} else if (match < target) {
// 目标在现有值右边,缩小左范围
++left;
} else { // 目标在现有值左边,缩小右范围
--right;
}
}
return {-1, -1};
}
};