优选算法专题9:哈希表

哈希表

目录

哈希表

哈希表简介

试题1:两数之和

算法原理

代码编写

试题2:判定是否为字符重排

算法原理

代码编写

试题3:存在重复元素

算法原理

代码编写

试题4:存在重复元素II

算法原理

代码编写

试题5:字母异位词分组

算法原理

代码编写


哈希表简介

概念:哈希表是存储数据的容器

作用:用来快速地查找某个元素

情况:频繁地查找某一个数时候

用法: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;
    }
};
相关推荐
gwf2161 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
noipp2 小时前
推荐题目:洛谷 P6231 [JSOI2013] 公交系统
c语言·数据结构·c++·算法·游戏·洛谷·luogu
c238562 小时前
C/C++每日一练6
c语言·c++·算法
AI小码2 小时前
把动作「画」给视频世界模型,跨本体双向推演,李飞飞参与
大数据·人工智能·算法·ai·大模型·音视频·编程
KaMeidebaby4 小时前
卡梅德生物技术快报|bli亲和力检测gst:告别批量跑胶:BLI实时酶切监测技术加速GST融合蛋白下游流程优化
前端·网络·数据库·人工智能·算法
alphaTao4 小时前
LeetCode 每日一题 2026/7/20-2026/7/26
算法·leetcode
jinyishu_7 小时前
哈希表原理与开放定址法C++实现
c++·哈希算法·散列表
青山木8 小时前
Hot 100 ---腐烂的橘子
java·数据结构·后端·算法·leetcode·广度优先
未来之窗软件服务8 小时前
计算机考试-快速排序—东方仙盟
数据结构·算法·排序算法·仙盟创梦ide·东方仙盟