题目描述:
解法一 :双指针法
分析 :针对数组问题,最直接的方式的就是通过遍历数组来完成题目的要求,利用好已知条件 升序排列的有序数组 我们设置两个指针 i 和 j ,初始状态分别指向数组的第一个元素和最后一个元素。通过比较numbers[i] + numbers[j] 和 target的值,如果相等,则达到题目要求,直接得到下标即可(注:题中下标从1开始) 如果numbers[i] + numbers[j] > target ,因为数组有序我们应该 j-- 使numbers[j]减小,同理如果 numbers[i] + numbers[j] < target ,我们应该使 i++ 。
代码:
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
vector<int> res; //用于存放下标
int i = 0;
int j = numbers.size()-1;
while(i<j){
if(numbers[i] + numbers[j] == target){
res.push_back(i+1);
res.push_back(j+1);
break; //找到一组满足题意即可
}
if(numbers[i] + numbers[j] > target){
j--;
}
if(numbers[i] + numbers[j] < target){
i++;
}
}
return res;
}
};
时间复杂度:O(N) 遍历一次数组