1. 问题描述
在给定的数组
nums[]
中找出两个数,他们的和target。(满足
numsi+numsj=target
。返回这两个数在数组中的位置,起始位置为1。且
i<j
。
2. 方法与思路
第一遍扫描,建立hash映射;考虑到数组中可能有
numsi=numsj
的情况,映射结构为map<int , vector<int>> hs
。
numsi
为键值,初始下标保存到vector中,作为hs的值。
第二遍遍历,判断hs[
target−numsi
]是否存在,要排除
target−numsi=numsi
的情况。存在则保存结果,否则继续。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> v;
map<int,vector<int> > hs;
for(int i = 0; i < nums.size(); i++)
{
hs[nums[i]].push_back(i+1);
}
for(int i = 0; i < nums.size(); i++ )
{
if(hs.find(target-nums[i]) != hs.end())
{
if(target-nums[i] == nums[i] && hs[nums[i]].size() <2) continue;
v.push_back(i+1);
v.push_back(hs[target-nums[i]].back());
break;
}
}
return v;
}
};