
上篇我们介绍了哈希算法和哈希表的代码实现及其相关基本原理,本篇我们将结合具体题目,进一步深化对于哈希算法的掌握运用。
本题方法多样,且直接暴力遍历也可求解,此处主要讲解哈希算法求解该题。
这是⼀个典型的「⽤空间交换时间」的⽅式。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> hash;//哈希
for(int i=0;i<nums.size();i++)
{
int x=target-nums[i];
if(hash.count(x))
{
return {hash[x],i};
}
else
{
hash[nums[i]]=i;
}//存储下标
}
return {-1,-1};
}
};是否为字符重排的核心即为两字符串所含元素是否相等
class Solution {
public:
bool CheckPermutation(string s1, string s2) {
int hash[26]={0};//模拟哈希
if(s1.size()!=s2.size())
{
return false;
}//如果字符数量不匹配直接返回false
for(auto e:s1)
{
hash[e-'a']++;
}//记录字符及其数量
for(auto a:s2)
{
if(--hash[a-'a']<0)
{
return false;
}
}
return true;
}
};class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
unordered_set<int> hash;
for(auto e:nums)
{
if(hash.count(e))
{
return true;
}//如果该元素在此之前已出现过,证明出现重复元素
else
{
hash.insert(e);
}//反之正常插入即可
}
return false;
}
};贪心策略。如果我们按照下标「从⼩到⼤」的顺序遍历数组,当遇到两个元素相同,并且⽐较它们的下标时,这两个下标⼀定是
距离最近的,因为: • 如果当前判断符合条件直接返回 true ,⽆需继续往后查找。 • 如果不符合条件,那么前⼀个下标⼀定不可能与后续相同元素的下标匹配(因为下标在逐渐变⼤),那么我们可以⼤胆舍去前⼀个存储的下标,转⽽将其换成新的下标,继续匹配。

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;
}
};class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
unordered_map<string,vector<string>> hash;//哈希表
//排序遍历存储
for(auto &e:strs)
{
string temp=e;
sort(e.begin(),e.end());
hash[e].push_back(temp);
}
//取出数据
vector<vector<string>> ret;
for(auto [x,y]:hash)
{
ret.push_back(y);
}
return ret;
}
};尽管哈希算法效率优良,但仍存在部分局限:
改进策略
哈希算法是一种将混沌数据组织为秩序世界的强大工具。从哈希表到分布式系统,从密码学到大数据分析,它的影子无处不在。通过代码的实践,我们不仅看到了它的原理和应用,更领略了计算机科学的优雅与精妙。哈希算法将继续在未来的信息世界中,扮演不可或缺的角色,为我们揭示隐藏在数据深处的秘密。
本篇关于哈希算法的介绍就暂告段落啦,希望能对大家的学习产生帮助,欢迎各位佬前来支持斧正!!!