优选算法专题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;
    }
};
相关推荐
leobertlan6 小时前
痛苦系列 | DSP-03 跨越单位圆:Z变换与零极点分析
算法·程序员
蛋蛋的就会顺顺的6 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
开发小能手1237 小时前
答案daanC语言
数据结构·算法
Navigator_Z9 小时前
LeetCode //C - 1291. Sequential Digits
c语言·算法·leetcode
pride.li10 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
旺仔仔仔11 小时前
机器人项目实战(5):从单次抓取,到接收指令连续做事
算法
旺仔仔仔11 小时前
机器人项目实战(2):识别物体、提取点云,再到抓取姿态
算法
姜鱼问生11 小时前
密码明明一样,为什么 GPG 说“错的“?
后端·算法·架构
启观川11 小时前
数据结构与算法-第 3 章 常用算法-贪心算法
数据结构·笔记·python·算法·贪心算法
对空六课11 小时前
指标口径生效时间的版本查询实现
大数据·服务器·前端·算法·数据分析