题目:给定一个整数数组nums和一个目标值target,找出数组中和为目标值的两个整数,并返回他们的下标
输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
用哈希:查询一个元素是否出现过,或者是否再一个集合中,就用哈希!!!
这个题需要存放元素和下标,所以想到map
map是一种key value 的结构,用key保存数值,用value保存数值所在的下标
整体思路:将map存放我们访问过的元素,然后去遍历元素,用总值减去遍历的值,看看map中是否存在这个值
class Solution
{
public:
vector<int>twosum(vector<int>& nums, int target)
{
std::unordered_map<int, int>map; //定义一个map用来存放访问过的元素值和下标
for (int i = 0; i < nums.size(); i++)
{
auto iter = map.find(target - nums[i]);
//如果再map中找到了匹配这样的键值对
if (iter != map.end())
{
return {iter->second, i}; //就返回他的下标
}
//如果没有找到匹配对,就吧访问过的元素和放进map中
map.insert(pair<int, int>(nums[i], i));
}
return {};
}
};
本题主要掌握的是
1、哈希表:通过下标访问元素
常见的哈希结构:set、map、数组
2、map
映射 | 底层实现 | 是否有序 | 是否可以重复 | 是否可以更改数值 |
std::map | 红黑树 | key有序 | key不可以重复 | key值不可以修改 |
std::multimap | 红黑树 | key有序 | key可以重复 | key值不可以修改 |
std::unorderedmap | 哈希表 | key无序 | key不可以重复 | key不可以更改 |