题目链接:点击这里
一个最直观的想法是,使用二重循环枚举序列中的整数,判断它们的和是否为
,如果是,输出方案;如果不是,则继续枚举。
显然,这种做法的时间复杂度为O(n2),对 在 的规模时是不可承受的。
【two pointers】
初始化:令下标 的初值为 ,下标 的初值为 ,即令 、 分别指向第一个元素和最后一个元素。
two pointers 思想充分利用了序列递增的性质,变量 只有递增操作、变量 只有递减操作, 和 的操作次数最多为 次,时间复杂度为 。
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int i = 0, j = numbers.size()-1;
while(i<j)
{
int sum = numbers[i]+numbers[j];
if(sum==target)
return {i+1,j+1}; //have exactly one solution
else if(sum<target)
i++;
else
j--;
}
return {-1,-1};
}
};