这题一个穷举方法是比较好想到的:
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,初始化为两个元素,值为0vector<int> result(2, 0);// 使用双指针法,循环直到 i 大于等于 jfor (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;}
};