哈希表是什么?
一种数据结构,用于存储元素。
有什么用?
用于快速查找元素 与 插入
何时用哈希表?
频率统计、查找(数据和下标)、高效的插入删除等
如何用哈希表
思路
代码
vector<int> twoSum(vector<int>& nums, int target) {
// 哈希
unordered_map<int, int> hash; // <nums[i], i>
for(int i = 0; i < nums.size(); ++i)
{
int x = target - nums[i];
if(hash.count(x)) return {hash[x], i}; // 返回下标
hash[nums[i]] = i;
}
return {-1, -1};
}
思路
代码
bool CheckPermutation(string s1, string s2) {
if(s1.size() != s2.size()) return false; // 字符长度不同,false
int words[26] = {};
for(char ch : s1) // 记录s1中字符出现次数
words[ch - 'a']++;
for(char ch : s2) // 如果有s2中的字符,则哈希--
words[ch - 'a']--;
for(int i = 0; i < 26; ++i)
{
if(words[i] < 0) return false; // 如果
}
return true;
}
思路
代码
bool containsDuplicate(vector<int>& nums) {
// 哈希
unordered_map<int, int> countMap;
for(int x : nums) // 记录各元素出现次数
countMap[x]++;
for(auto it = countMap.begin(); it != countMap.end(); ++it)
{
if(it->second > 1) return true;
}
return false;
}
思路
代码
bool containsNearbyDuplicate(vector<int>& nums, int k) {
unordered_map<int, int> countMap;
// 遍历数组,如果该数出现在哈希表,则代表重复:判断下标是否满足条件
// 未出现在哈希表,则加入哈希表
for(int i = 0; i < nums.size(); ++i)
{
int x = nums[i];
if(countMap.count(x) && i - countMap[x] <= k)
return true;
countMap[x] = i;
}
return false;
}
思路
代码
vector<vector<string>> groupAnagrams(vector<string>& strs) {
unordered_map<string, vector<string>> hash;
// 将字母异位词分类放入哈希表
for(string s : strs)
{
string tmp = s;
sort(tmp.begin(), tmp.end());
hash[tmp].push_back(s);
}
vector<vector<string>> ret;
// 提取字符串到数组
for(auto& [x, y] : hash) // [x, y],指代哈希表的两个类型
{
ret.push_back(y);
}
return ret;
}