优选算法专题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;
    }
};
相关推荐
倒头就睡的小比特2 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼2 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
m0_547486662 天前
《数据结构教程》全套 PPT课件2026
数据结构
旖旎夜光2 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark2 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her12 天前
并查集-听课笔记
笔记·算法·并查集
码流子2 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven2 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark2 天前
从算法设计模式看编程思维的抽象能力4
算法