您的位置:首页 > 其它

leetecode two sum

2015-09-07 11:06 323 查看
Given an array of integers, find two numbers such that they add up to a specific target number.The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.You may assume that each input would have exactly one solution.Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2

解答一:
第一遍,遍历数组,用hash表记录数字的下标,如果有多个,则按顺序从前到后存储,
第二遍,遍历数组,查表,a,target-a 如果target-a存在,这时分两种情况,
1.a==target-a,依据vector<int> size是否大于1,如果大于,则已经找到,可以返回,

2.如果不等于,则看table【target-a】是否存在,如果存在,已经找到。

unordered_map<int,vector<int>> table

代码:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,vector<int>> table;
int size=nums.size();
if(size==0)
return vector<int>();
vector<int> results;

for(int i=0;i<size;++i){
table[nums[i]].push_back(i+1);
}

for(int i=0;i<size;++i){
int res=target-nums[i];
if(res==nums[i]){
if(table[nums[i]].size()>1){
results.push_back(table[res][0]);
results.push_back(table[res][1]);
break;
}
}
else{
unordered_map<int,vector<int> >::const_iterator itor=table.find(res);
if(itor!=table.end()){
results.push_back(i+1);
results.push_back(table[res][0]);
break;
}
}
}
return results;
}
};

解法二:
由法一可以看出,如果存在两个数的和为target,则a,b这两个数出现的顺序必然不同,则可以通过当一个数为a时,查看b是否已经存入到hash里,如果有则已经找到,可以返回,

如果没有,则保存到hash里,继续遍历,该方法理想复杂度为o(n)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,vector<int>> table;
int size=nums.size();
if(size==0)
return vector<int>();
vector<int> results;

for(int i=0;i<size;++i){
int res=target-nums[i];
unordered_map<int,vector<int> >::const_iterator itor=table.find(res);
if(itor!=table.end()){
results.push_back((itor->second)[0]);
results.push_back(i+1);
break;
}
else
table[nums[i]].push_back(i+1);
}
return results;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: