【算法】了解哈希表/思想 并用哈希解算法题(C++)

文章目录

  • 基本了解
  • 解题
    • 1.两数之和
    • 面试题01.02.判定是否互为字符重排
    • 217.存在重复元素
    • 219.存在重复元素II
    • 49.字母异位词分组

基本了解

哈希表是什么?

一种数据结构,用于存储元素。

有什么用?

用于快速查找元素 与 插入

何时用哈希表?

频率统计、查找(数据和下标)、高效的插入删除等

如何用哈希表

  1. 解题时,可以直接使用容器类(unordered_map, unordered_set)
  2. 使用数组代替哈希表

解题

1.两数之和

在这里插入图片描述
思路

  • 题意分析:要求找和为target的两个数,即对于nums[i],只需要找到个值为target-nums[i]的数的下标
  • 解法哈希表
    在这里插入图片描述

代码

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

面试题01.02.判定是否互为字符重排

在这里插入图片描述

思路

  • 题意分析:如果两字符串符合重排,则所有字符一定相同
  • 解法数组代替哈希表
    • 当有类似的比较字符,数组元素,与次数相联系的,都可以尝试使用哈希表
    • 由于题目中字符串只包含小写字母,我们使用大小为26的数组即可
    1. 初始化哈希表所有位为0(哈希表用于记录每个字符的出现次数)
    2. 哈希表首先记录s1字符的出现次数,再将s2中所有字符从hash中减去
    3. 如果hash中存在负数,则证明两字符串所含字符有不同,即不为重排

代码

bool CheckPermutation(string s1, string s2) {
     if(s1.size() != s2.size()) return false; // 字符长度不同,false

     int words[26] = {};
     for(char ch : s1) // 记录s1中字符出现次数
         words[ch - 'a']++;
 
     for(char ch : s2) // 如果有s2中的字符,则哈希--
         words[ch - 'a']--;

     for(int i = 0; i < 26; ++i)
     {
         if(words[i] < 0)    return false; // 如果
     }

     return true;
}

217.存在重复元素

在这里插入图片描述

思路

  • 题意分析:即判断数组是否存在重复元素(这不哈希表?)
  • 解法一排序
    • 直接用sort排序数组后遍历数组比较后一位即可
  • 解法二哈希表
    1. 通过哈希表统计数组中所有元素的出现次数
    2. 遍历哈希表(通过迭代器)找是否有次数 > 1的数

代码

bool containsDuplicate(vector<int>& nums) {
    // 哈希
    unordered_map<int, int> countMap;
    for(int x : nums) // 记录各元素出现次数
        countMap[x]++;

    for(auto it = countMap.begin(); it != countMap.end(); ++it)
    {
        if(it->second > 1) return true;
    }

    return false;
}

219.存在重复元素II

在这里插入图片描述

思路

  • 题意分析:即在数组中找到值相同的两个元素,满足两元素距离 <= k
  • 解法哈希表
    • 解法与两数之和类似
    1. 遍历数组
      • 每次记录当前元素的值,在哈希表中查找是否已有该值
      • 如果存在:判断两个元素的下标是否<=k
      • 如果不存在,将当前元素加入到哈希表中
    2. 数组遍历结束,找不到满足条件的,返回false

代码

bool containsNearbyDuplicate(vector<int>& nums, int k) {
    unordered_map<int, int> countMap;

    // 遍历数组,如果该数出现在哈希表,则代表重复:判断下标是否满足条件
    // 未出现在哈希表,则加入哈希表
    for(int i = 0; i < nums.size(); ++i)
    {
        int x = nums[i];
        if(countMap.count(x) && i - countMap[x] <= k)   
            return true;
        countMap[x] = i; 
    }
    return false;
}

49.字母异位词分组

在这里插入图片描述
思路

  • 题意分析:字母异位词即满足字符重拍的两字符串,将给定的字符串数组按照字母异位词分组
  • 解法哈希表(存储分类后的结果vector<string>)
    1. 将字母异位词存入哈希表
      • 遍历strs,提取每个字符串并排序,将排序后的结果加入到哈希表中
      • 遍历执行完毕,此时所有的字母异位词都在哈希表中分了类
    2. 提取哈希表中的字符串到结果数组
      • 直接利用auto [x, y] 提取出hash中的y
      • 即所有字母异位词的分组(vector<string>)

代码

vector<vector<string>> groupAnagrams(vector<string>& strs) {
    unordered_map<string, vector<string>> hash;
    
    // 将字母异位词分类放入哈希表
    for(string s : strs)
    {  
        string tmp = s;
        sort(tmp.begin(), tmp.end());
        hash[tmp].push_back(s);
    }

    vector<vector<string>> ret;
    // 提取字符串到数组
    for(auto& [x, y] : hash) // [x, y],指代哈希表的两个类型
    {
        ret.push_back(y);
    }
    return ret;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/321058.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

最大公约数和最小公倍数

1. 最大公约数 给定两个整数&#xff0c;求这两个数的最大公约数 暴力求解&#xff1a; 从较小的那个数开始&#xff0c;依次递减&#xff0c;直到某个数能够同时被整除 //暴力求解 int main() {int a 0;int b 0;scanf("%d %d", &a, &b);int i 0;int min …

Matlab深度学习进行波形分割(二)

&#x1f517; 运行环境&#xff1a;Matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 &#x1f510;#### 防伪水印——左手の明天 ####&#x1f510; &#x1f497; 大家…

三、ngxin虚拟主机

目录 什么是nginx虚拟主机修改端口 访问页面1、配置nginx.config 文件2、 添加配置给目录中写入内容检测nginx 是否有语法错误&#xff08;nginx -t&#xff09;重启 nginx查看配置结果 不同主机网卡 查看到不同的页面先添加一个临时ip修改ngixn配置文件创建目录文件检测nginx …

聊聊websocket那些事

前端必备工具推荐网站(免费图床、API和ChatAI等实用工具): http://luckycola.com.cn/ 一、什么是websocket? WebSocket 是一种在单个 TCP 连接上进行全双工通信的网络协议。 它是 HTML5 中的一种新特性&#xff0c;能够实现 Web 应用程序和服务器之间的实时通信&#xff0c;…

C++PythonC# 三语言OpenCV从零开发(1):环境配置

文章目录 前言课程选择环境配置PythonC#COpenCV官网下载新建C项目测试运行Csharp版Python版 gitee仓库总结 前言 由于老王我想转机器视觉方向的上位机行业&#xff0c;我就打算开始从零学OpenCV。但是目前OpenCV有两个官方语言&#xff0c;C和Pyhont。C# 有大佬做了对应的Open…

数据结构——顺序二叉树——堆

1.树的相关概念 在介绍二叉树之前&#xff0c;我们首先要明确树是什么。 树用我们的通常认识来判断应该是一种植物&#xff0c;从根向上生长&#xff0c;分出许多的树枝并长出叶子。对于数据结构中的树而言&#xff0c;其结构也正是从树的特征中剥离出来的。树结构是一种非线性…

8 - MySQL数据读写分离|MySQL多实例

MySQL数据读写分离&#xff5c;MySQL多实例 MySQL数据读写分离数据读写分离如何实现数据的读写分离提供数据读写分离服务的软件&#xff08;中间件&#xff09;maxscale 软件提供的读写分离服务的工作过程配置数据读写分离结构 提供数据存储服务 MySQL多实例 MySQL数据读写分离…

[NAND Flash 6.4] NAND FLASH基本读操作及原理_NAND FLASH Read Operation源码实现

依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< ​全文 6000 字 内容摘要 NAND Flash 引脚功能 读操作步骤 NAND Flash中的特殊硬件结构 NAND Flash 读写时的数据流向 Read 操作时序 读时序操作过…

求斐波那契数列矩阵乘法的方法

斐波那契数列 先来简单介绍一下斐波那契数列&#xff1a; 斐波那契数列是指这样一个数列&#xff1a;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8&#xff0c;13&#xff0c;21&#xff0c;34&#xff0c;55&#xff0c;89……这个数列从第3项开始 &…

webstorm最新版 激活 成功了

使用webstorm开发工具 很完美&#xff0c;第一次用webstorm IDE 开发工具就完美的激活了&#xff0c;你也不妨试试 链接地址&#xff1a;http://mano100.cn/thread-1942-1-1.html 激活后如下

DM数据库安装注意事项

数据库安装注意事项 一、安装前 一些参数需要在数据库创建实例前找用户确认。 参数名参数掩码参数值备注数据页大小PAGE_SIZE32数据文件使用的页大小(缺省使用8K&#xff0c;建议默认&#xff1a;32)&#xff0c;可以为 4K、8K、16K 或 32K 之一&#xff0c;选择的页大小越大…

Linux常用命令之cp、rm、touch、mv

cp: 复制文件或目录 -f 覆盖目标同名文件或目录时不进行提醒&#xff0c;而直接强制复制。-i 覆盖目标同名文件或目录时提醒用户确认。-p 复制时保持源文件的权限、属主及时间标记等属性不变&#xff08;默认权限属主是变化的&#xff09;。-r 复制目录时必须使用此选项&a…

Nacos注册中心-安装

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、认识Nacos二、安装Nacos1.直接方法nacos.io&#xff0c;点击view onGithub2.点击Releases3、点击Tags&#xff0c;可以看见所有版本&#xff0c;建议下载1.…

Baumer工业相机堡盟工业相机如何使用OpenCV实现相机图像的显示(C#)

Baumer工业相机堡盟工业相机如何使用OpenCV实现相机图像的显示&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机的图像转换为OpenCV的Mat图像的技术背景在NEOAPI SDK里使用OpenCV实现相机图像的显示联合OpenCV实现相机图像的显示测试演示图 工业相机通过使用OpenCV实现…

史诗级长文--朴素贝叶斯

引言 朴素贝叶斯算法是有监督的学习算法&#xff0c;解决的是分类问题&#xff0c;如客户是否流失、是否值得投资、信用等级评定等多分类问题。该算法的优点在于简单易懂、学习效率高、在某些领域的分类问题中能够与决策树、神经网络相媲美。但由于该算法以自变量之间的独立&am…

java: 5-6 break

文章目录 1. break1.1 介绍1.2 语法和流程图1.3 入门练习1.4 细节说明1.5 练习 【老韩视频p137-】 1. break 看个需求&#xff1a;随机生成 1-100 的一个数&#xff0c;直到生成了 97 这个数&#xff0c;看看你一共用了几次? 【思路分析:循环&#xff0c;但是循环的次数不知道…

VQE音频处理流程

VQE 上行VQE&#xff0c;主要针对MIC采集部分的音频增强 下行VQE&#xff0c;主要针对SPK播放部分的音频增强 附关键词解释 RES RES 模块为重采样&#xff08;Resampler&#xff09;模块。当AI上行或AO下行通路中开启VQE 各功能 模块时&#xff0c;在处理前后各存在一次重采样…

实战之-Redis代替session实现用户登录

一、设计key的结构 首先我们要思考一下利用redis来存储数据&#xff0c;那么到底使用哪种结构呢&#xff1f;由于存入的数据比较简单&#xff0c;我们可以考虑使用String&#xff0c;或者是使用哈希&#xff0c;如下图&#xff0c;如果使用String&#xff0c;注意他的value&…

计算机网络技术-2022期末考试解析

【前言】 这是计算机网络技术这门课&#xff0c;感觉和计网还是有不一样的&#xff0c;但也有能做的&#xff0c;把能做的做了。 一、单项选择题&#xff08;每题2分&#xff0c;共20分&#xff09; 1. 用于测试两台计算机连通状况的命令是 。 ( ) A. cmd B. ping C. ipconf…

代码随想录day30 回溯算法最终章

51. N皇后 题目 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方案。 每一种解法包含一个不同的 n 皇后问题 的棋子放置方案&#xff0c;该方案中 Q 和…