文章目录
- 两数之和
- 判断是否互为字符重排
- 存在重复元素
- 存在重复元素
- 字母异位词分组
本文总结的是关于哈希表常见的算法
哈希表其实就是一个存储数据的容器,所以其实它本身的算法难度并不高,只是利用哈希表可以对于一些场景进行优化
两数之和
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};hash[nums[i]] = i;}return {-1, -1};}
};
判断是否互为字符重排
class Solution
{
public:bool CheckPermutation(string s1, string s2) {int hash1[26] = {0};for(auto e : s1)hash1[e - 'a']++;for(auto e : s2)hash1[e - 'a']--;for(int i = 0; i < 26; i++)if(hash1[i])return false;return true;}
};
存在重复元素
class Solution
{
public:bool containsDuplicate(vector<int>& nums) {unordered_map<int, int> dict;for(auto& e : nums)dict[e]++;for(auto& e : nums)if(dict[e] != 1)return true;return false;}
};
其实是可以优化的,不需要看出现了几次,这个题只关心有没有的问题,因此使用set
就可以了
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;}
};
存在重复元素
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]) && abs(hash[nums[i]] - i) <= k){return true;}else{hash[nums[i]] = i;}}return false;}
};
字母异位词分组
class Solution
{
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {unordered_map<string, vector<string>> hash;// 把数据拿进去for(auto s : strs){string tmp = s;sort(tmp.begin(), tmp.end());hash[tmp].push_back(s);}// 再取出来vector<vector<string>> res;for(auto& [x, y] : hash){res.push_back(y);}return res;}
};
这里主要是说明,哈希表中是可以存储其他内容的,同时也体现出泛型编程的强大之处