这题一个穷举方法是比较好想到的:
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int i,j;
int n=numbers.size();
vector<int>result(2,0);
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(numbers[i]+numbers[j]>target)
break;
if(numbers[i]+numbers[j]==target)
{
result[0]=i+1;
result[1]=j+1;
return result;
}
}
}
return result;
}
};
但是很显然会超时,而可知numbers是非递减的,所以我们想到双指针方法。
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
// 定义两个指针 i 和 j,分别指向数组的起始和末尾
int i, j;
// 获取数组的长度
int n = numbers.size();
// 定义一个存储结果的向量 result,初始化为两个元素,值为0
vector<int> result(2, 0);
// 使用双指针法,循环直到 i 大于等于 j
for (i = 0, j = n - 1; i < j;) {
// 如果当前两个指针指向的元素之和大于目标值,则将 j 指针向左移动
if (numbers[i] + numbers[j] > target)
j--;
// 如果当前两个指针指向的元素之和小于目标值,则将 i 指针向右移动
else if (numbers[i] + numbers[j] < target)
i++;
// 如果当前两个指针指向的元素之和等于目标值,则找到了结果,更新 result 向量并返回
else {
result[0] = i + 1; // 注意题目要求的是从 1 开始计数
result[1] = j + 1;
return result;
}
}
// 如果未找到符合条件的两个数,返回初始时初始化的 result 向量
return result;
}
};