审题上:首先该题可能在题目描述上有些问题,该题所说的“给你一个下标从1开始的整数数组”的意思并不是说真的该数组中的第一个元素在下标为1的内存里,而是说我们在最后返回的时候要把该数组当成是下标从1开始的,即我们的第一个元素下标还是0,只不过返回时下标都要+1
该题有两种方法可以解决
1.二分查找法
思路:我们以该数组的一个元素作为标准,然后我们遍历该元素之后的元素,直到找到能够和“标准元素”相加得到target,如果找不到,便标准元素下标++
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int pr=0,mid;
for(;pr<numbers.size()-1;pr++)
{
int left=pr+1,right=numbers.size()-1;
int t=target-numbers[pr];
while(left<=right)
{
mid=(right-left)/2+left;
if(numbers[mid]<t)
{
left=mid+1;
}
else if(numbers[mid]>t)
{
right=mid-1;
}
else
{
break;
}
}
if(numbers[mid]==t)
break;
}
vector<int> ans={pr+1,mid+1};
return ans;
}
};
2.双指针法
思路上:我们设置两个指针分别指向数组第一个元素和数组最后一个元素,如果两个元素加起来大于target,那么代表太大了,我们需要把更大的元素下标--;反之,更小的元素下标++,直到刚好=targe
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int i = 0, j = numbers.size() - 1;
while (i < j) {
if (numbers[i] + numbers[j] > target) --j;
else if (numbers[i] + numbers[j] < target) ++i;
else return {i + 1, j + 1};
}
return {i, j};
}
};