题目描述
给定一个按升序排序的数组,请找出两个数,使得它们的和等于 $target$。
你的函数需要返回两个数的下标,两个下标不能相同,较小的下标在前,较大的下标在后。
注意:
- 你返回的下标是从1开始的。
- 数据保证有且仅有一组解。
- 数组中的每个数仅能用一次。
样例
输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2与7的和是9,它们的下标是1和2。
算法
(双指针扫描) $O(n)$
用两个指针 $i, j$ 分别从数组首尾往中间扫描,每次将 $i$ 后移一位,然后不断前移 $j$,直到 $numbers[i] + numbers[j] \le target$ 为止。如果 $numbers[i] + numbers[j] == target$,则找到了一组方案。
时间复杂度分析:两个指针总共将数组扫描一次,所以时间复杂度是 $O(n)$。
C++ 代码
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
for (int i = 0, j = numbers.size() - 1; i < j; i ++ )
{
while (numbers[j] + numbers[i] > target) j -- ;
if (numbers[j] + numbers[i] == target)
{
vector<int> res;
res.push_back(i + 1), res.push_back(j + 1);
return res;
}
}
return {};
}
};
大佬,这个程序过不了呀
vectror放在for循环前面,可以过
leetcode的评测器更新过一次,现在把好多warning都改成error了hh
已修改~
不加这个return {}为什么会被警告呀
函数必须要有返回值,否则会有警告。
哦哦
如果这个答案有多组,那应该怎么写呢
最坏情况下,所有数都相同,目标值是每个数的两倍,那么总共的方案数就有 $O(n^2)$ 个了,所以各种算法的最坏情况均会达到 $O(n^2)$。如果只需要求方案数,那么可以使用双指针算法,做到 $O(n)$。