常用的哈希数据结构
(1)unordered_set
只关心value,不关心key,set中的数据会自动升序
(2)unordered_map
既关心value,又关心key,map中的数据会自动升序
1、两数之和
(1)题目描述以及输入输出
(1)题目描述:
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。
(2)输入输出描述:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
关键思路:
将数组元素依次添加进unordered_map,每次查找target-nums[i],存在就将下标返回结果
(2)代码块
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target)
{
vector<int> result;
unordered_map<int,int> record;
for(int i = 0;i<nums.size();i++)
{
if(record.find(target-nums[i]) != record.end())
{
result.push_back(i);
result.push_back(record.find(target-nums[i])->second);
}
record[nums[i]] = i;
}
return result;
}
};
2、字母异位词分组
(1)题目描述以及输入输出
(1)题目描述:
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
(2)输入输出描述:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
关键思路:
创建unordered_map数据结构,排序后的strs[i]作为key,排序前的strs[i]作为value
auto it 遍历map,依次将map->second插入结果数组
(2)代码块
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs)
{
unordered_map<string,vector<string>> record;
string key;
for(int i = 0;i<strs.size();i++) // 将strs[i]添加进哈希表
{
key = strs[i];
sort(key.begin(),key.end());
record[key].push_back(strs[i]);
}
vector<vector<string>> result;
for(auto it = record.begin();it != record.end();it++)
{
result.push_back(it->second); // 将map->second添加进结果数组
}
return result;
}
};
3、最长连续序列
(1)题目描述以及输入输出
(1)题目描述:
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度
(2)输入输出描述:
输入:nums = [100,4,200,1,3,2]
输出:4
关键思路:
将nums映射进set,自动完成排序
使用.count()找到连续序列第一个值,从当前向后遍历记录连续序列长度
(2)代码块
class Solution {
public:
int longestConsecutive(vector<int>& nums)
{
int result = 0;
unordered_set<int> record(nums.begin(),nums.end()); // 数组映射进set完成排序
for(int num:record)
{
if(!record.count(num-1)) // 查找连续序列第一个值
{
int tmp = num; // 记录第一个值
while(record.count(tmp))
{
tmp++;
} // 直到最后一个值
result = max(result,tmp-num); // 记录序列长度
}
}
return result;
}
};