两数之和 II - 输入有序数组

分析

这道题算不上特别难。 基本上一眼就能得出双指针的方法。 但在介绍双指针方法之前,先来看一看以二分的思路是如何完成的。

二分的思路是先固定一个数字, 然后在右侧二分寻找满足 numbers[left] + numbers[right] == targetright。 换句话说,在固定好一个数字 numbers[i] 后,我们需要寻找一个满足target - numbers[i]numbers[mid]。 由于答案唯一,所以我们在找到后可以直接返回。 注意:这道题在计算中间值 mid 时,由于编译器优化的特性可以考虑用 >>1 来替代 /2,从而方便编译器优化。

而双指针法则更简单。 我们只需要两个指针 leftright。 在 numbers[left] + numbers[right] = target 之前对 leftright 进行向中间移动即可。

解答

class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
int left = 0, right = numbers.size() - 1;
while (left < right) {
auto sum = numbers[left] + numbers[right];
if (sum == target)
return {left + 1, right + 1};
else if (sum > target)
right--;
else
left++;
}
return {-1, -1};
}
};
返回文章列表