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;
}
};
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;
}
};
相关文章推荐
- GPU performance tune on tile-based architecture
- ECDSA算法实现源码
- 最简便方法安装SVN插件
- 2小时玩转python基础(下)
- Android个性的ViewPager切换动画
- 认识 Cocos2dx 3.x
- 2015达沃斯大连:经济新常态下的软件业
- Android下的挂钩(hook)和代码注入(inject)
- 华为干部任职资格制度
- 漏洞论坛,平台
- Netty框架SimpleChannelInboundHandler<T>主要方法详解
- 12.iOS格式化日志输出的方法以及在发布状态自动关闭NSLog方法
- .bss section:C 語言所種下的因
- 竞业禁止制度与竞业限制的比较
- 架构设计:负载均衡层设计方案(2)——Nginx安装
- C 中结构体对齐
- Openssl aes加解密例程
- Angular.js概念及用法
- 条件随机场学习笔记(1)
- Hibernate – One-to-One example (XML Mapping)