题意:给一个数组,再给一个target,求数组中的2个数字,它们相加和尾target,给下标就好
思路 :O(n^2)自然是遍历2次
如果要O(n),则用哈希表
比如target是10,num[0]=2,则hash[8]=2,,如果下次出现了8,那么直接得出答案
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> hash;
int n=nums.size(),i,num;
vector<int> ans;
for(i=0;i<n;i++)
hash[nums[i]]=-1;
for(i=0;i<n;i++)
{
num=nums[i];
if(hash[num]==-1)
hash[target-num]=i;
else
{
ans.push_back(hash[num]);
ans.push_back(i);
return ans;
}
}
return ans;
}
};
经验和教训:
1.C++中hash表的用法:
unordered_map<int, int> hash; 前一个int是下标,后一个int是hash值
直接调用hash[ ]即可
一开始先将所有hash[ ]置某个特殊值进行判断
2.
vector<int> ans
<pre name="code" class="cpp">ans.push_back(i); //往向量中加数据就用push_back,在尾部加