哈希表
目录
哈希表简介
概念:哈希表是存储数据的容器
作用:用来快速地查找某个元素
情况:频繁地查找某一个数时候
用法:STL容器,或用数组模拟(字符串的字符,数据范围很小)
试题1:两数之和

算法原理
解法一:暴力解法(O(N^2))
先固定其中一个数,依次与该数之前的数相加
解法二:哈希表(O(N))

代码编写
cpp
class Solution
{
public:
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};
}
};
试题2:判定是否为字符重排

算法原理
解法:哈希表
先判断s1每个字符出现的个数和s2相等
用数组模拟哈希表,将s1的数据统计到数组
根据s2减掉数组元素,直到数组没有元素
代码编写
cpp
class Solution
{
public:
bool CheckPermutation(string s1, string s2)
{
if(s1.size() != s2.size())
{
return false;
}
int hash[26] = { 0 };
//统计s1字符串
for(auto ch : s1)
{
hash[ch - 'a']++;
}
//减掉s2字符串
for(auto ch : s2)
{
hash[ch - 'a']--;
if(hash[ch - 'a'] < 0)
{
return false;
}
}
return true;
}
};
试题3:存在重复元素

算法原理
解法:哈希表
代码编写
cpp
class Solution
{
public:
bool containsDuplicate(vector<int>& nums)
{
unordered_set<int> hash;
for(auto x : nums)
{
if(hash.count(x))
{
return true;
}
else
{
hash.insert(x);
}
}
return false;
}
};
试题4:存在重复元素II

算法原理
解法:哈希表
代码编写
cpp
class Solution
{
public:
bool containsNearbyDuplicate(vector<int>& nums, int k)
{
unordered_map<int, int> hash;
for(int i = 0; i < nums.size(); i++)
{
if(hash.count(nums[i]))
{
if(i - hash[nums[i]] <= k)
{
return true;
}
}
hash[nums[i]] = i;
}
return false;
}
};
试题5:字母异位词分组

算法原理
解法:哈希表
判断两个字符串是否是字母异位词:排序
如何分组:哈希表
<string,vector<string>>
"aet" -> "eat" "tea" "ate"
"ant" -> "tan" "nat"
"abt" -> "bat"
代码编写
cpp
class Solution
{
public:
vector<vector<string>> groupAnagrams(vector<string>& strs)
{
unordered_map<string, vector<string>> hash;
//1. 把所有字母异位词分组
for(auto &s : strs)
{
string tmp = s;
sort(tmp.begin(), tmp.end());
hash[tmp].push_back(s);
}
//2. 提取结果
vector<vector<string>> ret;
for(auto & [x, y] : hash)
{
ret.push_back(y);
}
return ret;
}
};