欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > LeetCode刷题 -- 哈希表

LeetCode刷题 -- 哈希表

2025/5/2 8:51:44 来源:https://blog.csdn.net/2301_79722622/article/details/144239352  浏览:    关键词:LeetCode刷题 -- 哈希表

目录

  • 两数之和
    • 题目解析
    • 算法原理
    • 代码
  • 面试题 01.02. 判定是否互为字符重排
  • 题目解析
    • 算法原理
    • 代码
  • 存在重复元素
    • 题目解析
    • 算法原理
    • 代码
  • 存在重复元素II
    • 题目解析
    • 算法原理
    • 代码
  • 字母异位词分组
    • 题目解析
    • 算法原理
    • 代码

两数之和

题目链接

题目解析

在这里插入图片描述

算法原理

法一:暴力枚举,固定第一个数,从第二个数开始遍历找两数之和为target,从固定的数往后遍历
法二:暴力枚举,固定第一个数,从第一个数遍历到固定的数

法三从法二的基础上,加入一个哈希表,只要前面的数和固定的数相加不等于target就丢入哈希表中,相等就返回两个数的下标

法四:在法一的基础上,加入一个哈希表,先把所有的数丢入哈希表中,在判断固定的数和表中的数相加是否为target,但是要特判同一个数相加为target
比如[1,3,4,5] target = 8 固定的数是4,哈希表中的数也是4,这样要判断 nums[i] == x&&hash[nums[i]] != i ,x = target - nums[i]

在这里插入图片描述

代码

class Solution 
{
public:vector<int> twoSum(vector<int>& nums, int target) {// vector<int> ret;// int n = nums.size();// for(int i = 0;i < n;++i)// {//     for(int j = i-1;j >= 0;j--)//     {//        if(nums[i] + nums[j] == target) //        {//         ret.push_back(i);//         ret.push_back(j);//         break;//        }//     }//     if(ret.size() == 2) break;// }// return ret;unordered_map<int,int> hash;// 存储元素的值和下标int n = nums.size();for(int i = 0;i < n;++i){int x = target - nums[i];if(hash.count(x)) return {hash[x],i};// hash.count(x) 是在哈希表中找xelse hash[nums[i]] = i;}return {-1,-1};}
};

面试题 01.02. 判定是否互为字符重排

题目链接

题目解析

s1字符串重排后可以得到s2字符串

在这里插入图片描述

算法原理

法一:只用一个数组模拟哈希表,先把字符串1丢入哈希表中,再遍历字符串2,如果字符串2中存在字符串1中的字符,哈希表就减减,如果哈希中的值小于0则为假

法二:用两个数组模拟哈希表,先把字符串1中字符丢入哈希表中,再把字符串2丢入第二个哈希表中,再遍历26个字符判断对应字符是否存在

在这里插入图片描述

代码

class Solution 
{
public:bool CheckPermutation(string s1, string s2) {if(s1.size() != s2.size()) return false;int hash[26] = {0};for(auto ch : s1) hash[ch - 'a']++;for(auto ch : s2) {hash[ch - 'a']--;if(hash[ch - 'a'] < 0) return false;}return true;// int hash1[128] = {0}; // s1// int hash2[128] = {0}; // s2// for(int i = 0;i < s1.size();++i)// hash1[s1[i]]++;// for(int i = 0;i < s2.size();++i)// hash2[s2[i]]++;// for(int i = 97;i < 128;++i)// {//     if(hash1[i] != hash2[i]) return false;// }// return true;}
};

存在重复元素

题目链接

题目解析

在这里插入图片描述

算法原理

这题和两数之和的解法是一样的
只需要从前往后遍历,把前面的数都加入哈希表中,固定到某个数时,诺某个数出现了第二次就返回true,否则返回false

在这里插入图片描述

代码

class Solution 
{
public:bool containsDuplicate(vector<int>& nums) {unordered_set<int> hash;for(auto ch : nums){if(hash.count(ch)) return true; else hash.insert(ch);}return false;}
};

存在重复元素II

题目链接

题目解析

满足两个条件即可返回true,否则返回false

在这里插入图片描述

算法原理

只要注意一个细节即可,前面的数对可以被覆盖(hash[nums[i]] = i),因为找i - j <= k,保证下标离得近

在这里插入图片描述

代码

class Solution
{
public:bool containsNearbyDuplicate(vector<int>& nums, int k) {unordered_map<int,int> hash;// nums[i] iint n = nums.size();for(int i = 0;i < n;++i){if(hash.count(nums[i])){if(i - hash[nums[i]] <= k)return true;}hash[nums[i]] = i;}    return false;}
};

字母异位词分组

题目链接

题目解析

把字符串按ASCII码排序后的一样的分为一组
返回这样的二维数组

在这里插入图片描述

算法原理

  1. 先排序再分组(使用哈希表<string,string[]>)
    第一个存字符串,第二个存字符串数组
  2. 排好序的下标是一样的因此可以让tmp存下标(存排好序的下标),再把s加入到哈希表中(s保存的是排序前的字符串)
  3. 最后把结果给取出来

在这里插入图片描述

代码

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){// y -> vector<string>// ret的每一行也是vector<string>ret.push_back(y);}return ret;}
};

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词