题目描述:
给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。
函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例1:
输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
示例2:
输入:numbers = [2,3,4], target = 6
输出:[1,3]
示例3:
输入:numbers = [-1,0], target = -1
输出:[1,2]
代码:
#include<string>
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
vector<int> v;
int n=numbers.size(),s=numbers[n-1]+1+1000;
int a[s];
memset(a,0,sizeof(int)*s);
cout<<endl;
for(int i=0;i<n;i++){
int m = target-numbers[i];
if((m+1000<s)&&a[m+1000]==1){
v.push_back(i+1);
for(int j=i+1;j<n;j++){
if(numbers[j]==m){
v.push_back(j+1);
break;
}
}
break;
}
}
return v;
}
};
直接使用暴力解法双层for循环会超时。
使用数组查询的方式代替for循环查询,只需要判断对应的数组值即可,查询时间为常数。
a[m]=1则表示m在输入的数组numbers中,即找到了结果。
注意输入的numbers数组中的数字可能为负数,范围是-1000 <= numbers[i] <= 1000,所以在以numbers[i]为下标用数组a记录时,应加1000,保证a数组下标为正数,即a[numbers[i]+1000]=1