题目:
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
翻译:
给定一个整形数组和一个整数target,返回2个元素的下标,它们满足相加的和为target。
你可以假定每个输入,都会恰好有一个满足条件的返回结果。
代码一:暴力解法,时间复杂度为O(n^2)
vector<int> twoSum(vector<int> &numbers, int target) {
int len=numbers.size();
vector<int> result;
for(int i=0;i<len-1;i++)
{
for(int j=i+1;j<len;j++)
{
if((numbers[i]+numbers[j])==target)
{
result.push_back(i+1);
result.push_back(j+1);
break;
}
}
}
return result;
}
代码二,建立一个哈希表,依次读取数组中的每个数,对于一个数,如果(
target-这个数)后能在哈希表里面找到,那么就能直接输出了,如果没有找到,那么我们把这个数存放在哈希表里面。整体下来,每个数其实在数组中就被查阅了一次,而在哈希表的查阅为O(1),因此总的时间复杂度为O(n)
vector<int> twoSum(vector<int> &numbers, int target) {
int len=numbers.size();
map<int,int> index;
vector<int> result;
for(int i=0;i<len;i++)
{
if(index.find(target-numbers[i])==index.end())//没找到
{
index.insert(pair<int,int>(numbers[i],i));
}
else{//找到
result.push_back(i+1);
result.push_back(index[target-numbers[i]]+1);
break;
}
}
sort(result.begin(),result.end());//因为插入顺序并不确定
return result;
}