LeetCode 1. 两数之和
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
思路 1 :
哈希法
首先,思考,哈希表的作用——>什么时候使用哈希法,当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。
哈希法可以帮助我们快速的判断元素是否出现在集合中,这题可以通过哈希法借助题目所给的条件:nums[ i ] + nums[ j ] = target ,来快速找到满足条件的组合
即,先构造一个 unordered_map 来表示哈希表,unordered_map 的查找效率为(0N (1)),当还没找到满足条件的元素是当前元素加入哈希表中
其中,最主要的判断条件为:
auto it=mp.find(target-nums[i]);
//找到与当前nums[i]配对的元素
if(it!=mp.end())
{
ans.push_back(i);
ans.push_back(it->second);
return ans;
}
如果,在unordered_map 中没有满足条件的元素,则放回end()迭代器
巧用关系,降低时间
完整代码如下:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
//用unordered_map解题
vector<int> ans;
//key : 数组元素 value : 元素下标
unordered_map<int,int> mp;
//遍历nums
for(int i=0;i<nums.size();i++)
{
//寻找元素是否在map中出现过
//即 寻找配对元素
auto it=mp.find(target-nums[i]);
//找到与当前nums[i]配对的元素
if(it!=mp.end())
{
ans.push_back(i);
ans.push_back(it->second);
return ans;
}
//未找到 把nums[i]加入map
mp[nums[i]]=i;
}
return ans;
}
};
最后,来个总结:
1 这个题目,体现哈希表通过题目条件关系,在集合中快速找到满足条件的元素
2 再次强调一遍,对于这题的哈希——>巧用find的重要性!!