跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

哈希表核心原理与经典算法实战

综述由AI生成哈希表通过键值对实现 O(1) 查找,常用于统计频次和去重。结合 C++ STL 容器,解析了五个经典算法场景:两数之和利用互补查找;字符排列检查使用频率数组;重复元素检测对比排序与哈希方案;邻近重复项记录索引距离;字母异位词分组则通过排序字符串作为键。掌握这些模式能显著提升处理数据关系的效率。

观心发布于 2026/3/30更新于 2026/6/1117 浏览
哈希表核心原理与经典算法实战

哈希表核心原理与实战

哈希表是处理数据查找、统计和去重的利器。在 C++ 中,unordered_map 和 unordered_set 提供了平均 O(1) 的访问效率,非常适合应对高频查询场景。

下面我们通过五个经典案例,看看如何灵活运用哈希结构解决实际问题。

两数之和

给定一个整数数组和一个目标值,找出和为目标值的两个数的下标。最直接的想法是暴力枚举,但利用哈希表可以将时间复杂度降为 O(n)。

思路很简单:遍历数组时,计算当前数字需要的补数(target - nums[i]),如果补数已经在哈希表中出现过,说明找到了答案;否则将当前数字及其下标存入表中。

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};
    }
};

注意这里先查后存,避免重复使用同一个元素。

字符排列检查

判断两个字符串是否互为字母重排。这本质上是在比较字符频次。

我们可以用一个长度为 26 的数组模拟哈希计数。先统计第一个字符串中每个字符的出现次数,再遍历第二个字符串进行抵消。如果过程中出现负数,或者最终有剩余,说明不匹配。

文章配图 文章配图 文章配图

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

存在重复元素

检测数组中是否有重复值。虽然排序法也能解决,但哈希集合的思路更直观——只要插入失败就说明有重复。

不过题目给出的示例代码采用了排序方案,逻辑同样严谨。排序后相邻元素若相等,则必然存在重复。

文章配图 文章配图 文章配图

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int n = nums.size();
        for (int i = 0; i < n - 1; i++) {
            if (nums[i] == nums[i + 1]) {
                return true;
            }
        }
        return false;
    }
};

存在重复元素 II

这次要求重复元素的下标差不能超过 k。这时候不仅要记录是否存在,还要记录位置。

用哈希表存储 数值 -> 下标。每次遇到已存在的数值,就计算当前下标与之前下标的差值,若满足条件直接返回 true。记得更新下标为最新位置。

文章配图 文章配图 文章配图

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;
    }
};

字母异位词分组

将字符串按字母异位词归类。核心在于找到一种'规范键',让互为异位词的字符串拥有相同的键。

对每个字符串排序后的结果作为 key,原字符串放入 value 列表中。最后收集所有列表即可。

文章配图 文章配图

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        unordered_map<string,vector<string>> hash;
        for(auto& e : strs){
            string ret = e;
            sort(ret.begin(), ret.end());
            hash[ret].push_back(e);
        }
        vector<vector<string>> a;
        for(auto& [x,y] : hash){
            a.push_back(y);
        }
        return a;
    }
};

掌握这些模式,面对涉及查找、计数或分组的问题时,就能快速定位到哈希表的适用场景。

目录

  1. 哈希表核心原理与实战
  2. 两数之和
  3. 字符排列检查
  4. 存在重复元素
  5. 存在重复元素 II
  6. 字母异位词分组
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • ROS 2 机器人运行指南:海龟仿真器与 ros2 run 命令详解
  • 位运算算法实战:从字符唯一性到缺失数字查找
  • C++ STL map 核心解析:从底层原理到 LeetCode 实战
  • C++ 继承进阶:友元、静态成员与菱形继承
  • 动态规划:路径问题
  • U 盘安装 macOS 系统详细教程
  • 利用 DeepSeek 与腾讯云 HAI 快速搭建个人网页
  • DeepSeek-R1 大模型基于 MS-Swift 框架的部署与微调实践
  • Qwen2.5-32B-Instruct 本地部署:快速搭建 AI 写作助手
  • 人工智能应用工程师(高级)课程体系与技术路径解析
  • VS Code 中 GitHub Copilot 代理功能与智能编程实战
  • DeepSeek-R1 大模型基于 MS-Swift 框架的部署推理与微调实践
  • FastAPI:Python 高性能 Web 框架核心解析
  • ABB RobotStudio 机器人仿真软件使用指南
  • DeepSeek-R1 大模型基于 MS-Swift 框架的部署、推理与微调指南
  • 秋叶绘世 Stable Diffusion 整合包使用指南
  • AI 数据标注平台选型与实践:效率提升背后的技术逻辑
  • Python 逆向反爬实战:签名算法、JS 混淆及风控检测
  • Win11 Gaming Copilot 隐私风险及设置关闭指南
  • Java 异常处理:从原理到实战最佳实践

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online