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

news2024/11/20 14:43:40

文章目录

  • 基本了解
  • 解题
    • 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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录 Leetcode160. 相交链表

题目&#xff1a; 代码(首刷看解析 2024年1月13日&#xff09;&#xff1a; class Solution { public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListNode *A headA, *B headB;while (A ! B) {A A ! nullptr ? A->next : headB;B B ! nullpt…

Shell编程自动化之Shell数学运算与条件测试

一、Shell数学运算 1.Shell常见的算术运算符号 序号算术运算符号意义1、-、*、/、%加、减、乘、除、取余2**幂运算3、–自增或自减4&&、||、&#xff01;与、或、非5、!相等、不相等&#xff0c;也可写成6、、-、*、/、%赋值运算符&#xff0c;a1相等于aa1 2.Shell常…

HUAWEI华为MateStation S台式机电脑12代PUC-H7621N,H5621N原装出厂Windows11.22H2系统

链接&#xff1a;https://pan.baidu.com/s/1QtjLyGTwMZgYiBO5bUVPYg?pwd8mx0 提取码&#xff1a;8mx0 原厂WIN11系统自带所有驱动、出厂主题壁纸、系统属性专属联机支持标志、Office办公软件、华为电脑管家等预装程序 文件格式&#xff1a;esd/wim/swm 安装方式&#xf…

高光谱分类论文解读分享之基于形态卷积神经网络的高光谱影像分类

IEEE TGRS 2021&#xff1a;基于形态卷积神经网络的高光谱影像分类 题目 Morphological Convolutional Neural Networks for Hyperspectral Image Classification 作者 Swalpa Kumar Roy; Ranjan Mondal; Mercedes E. Paoletti; Juan M. Haut; Antonio Plaza 关键词 Clas…

Ubuntu下使用Virtual Box中显示没有可用的USB设备

Ubuntu中使用Virtual Box&#xff0c;但是使用到USB时只有USB1.1可以使用&#xff0c;并且提示没有可以使用的USB设备&#xff0c;解决方法如下 下载并安装Vitrual Box提供的功能扩展包 分别点击帮助->关于&#xff0c;查看当前使用的版本进入到Virtual Box官网下载链接根…

LabVIEW在金属铜大气腐蚀预测评价系统中的应用

为了应对电子设备和仪器中金属铜因大气腐蚀带来的挑战&#xff0c;开发一种基于LabVIEW平台的先进预测评价系统。这个系统的设计宗旨是准确预测并评估在不同室内外环境中金属铜的腐蚀状况。我们团队在LabVIEW的强大数据处理和图形化编程支持下&#xff0c;结合实际的大气腐蚀数…

【Java语言基础②】Java基本语法——Java程序基本格式,注释,标识符,常量

通过前面的学习&#xff0c;大家对Java语言有了一个基础认识&#xff0c;但现在还无法使用Java语言编写程序&#xff0c;要熟练使用Java语言编写程序&#xff0c;必须充分掌握Java语言的基础知识。今天咱们就来聊一聊Java的基本语法。 1.java程序的基本格式 Java程序代码必须…

制作docker镜像时,使用copy命令统一文件的不同所属用户

一、背景 在制作docker镜像时&#xff0c;使用COPY命令&#xff0c;可以统一原本不同所属用户的文件为同一个用户root。 我们都知道&#xff0c;linux系统&#xff0c;不同的用户之间的访问是受限的。 整个文件夹的用户通体都是devuser&#xff0c;但是里面的文件却是其他用户…

4D 毫米波雷达:智驾普及的新路径(二)

4 4D 毫米波的技术路线探讨 4.1 前端收发模块 MMIC&#xff1a;级联、CMOS、AiP 4.1.1 设计&#xff1a;级联、单芯片、虚拟孔径 4D 毫米波雷达的技术路线主要分为三种&#xff0c;分别是多级联、级联 虚拟孔径成像技术、以及 集成芯片。&#xff08; 1 &#xff09;多级…

训练FastestDet(Anchor-Free、参数量仅0.24M),稍改代码使得符合YOLO数据集排布

文章目录 0 参考链接1 准备数据1.1 使用以下代码生成绝对路径的txt文件1.2 在config文件夹下新建一个xxx.names文件 2 配置训练参数3 稍改代码使得符合YOLO数据集排布4 开始训练 0 参考链接 官方的代码&#xff1a;FastestDet 1 准备数据 我已有的数据集排布&#xff1a;&am…

Python Matplotlib 动画教程:提高可视化吸引力的强大工具【第24篇—python:Matplotlib】

文章目录 &#x1f356; 方法一&#xff1a;使用pause()函数&#x1f680; 方法二&#xff1a;使用FuncAnimation()函数&#x1f94b; 线性图动画&#xff1a;&#x1f3bb; Python中的条形图追赶动画&#x1f30c; Python中的散点图动画&#xff1a;&#x1f6f9; 条形图追赶的…

Date怎么转localDate和localDate转Date

Date怎么转localDate 首先&#xff0c;将java.util.Date对象转换为java.time.Instant对象。Instant是表示时间戳的类&#xff0c;可以精确到纳秒级别。 Date date new Date();Instant instant date.toInstant(); 然后&#xff0c;使用java.time.ZoneId类来指定时区&#xf…

LV.13 D11 Linux驱动移植及内核深化 学习笔记

一、设备树 1.1 设备树 设备树是一种描述硬件信息的数据结构&#xff0c;Linux内核运行时可以通过设备树将硬件信息直接传递给Linux内核&#xff0c;而不再需要在Linux内核中包含大量的冗余编码 举例&#xff1a;让LED2闪烁的代码中&#xff0c;有逻辑代码和设备代码。Li…

VS中动态库的创建和调用

VS中动态库的创建和调用 库 ​ 库是写好的现有的&#xff0c;成熟的&#xff0c;可以复用的代码。库的存在形式本质上来说库是一种可执行代码的二进制。 ​ 库有两种&#xff1a;静态库&#xff08;.a、.lib&#xff09;和动态库&#xff08;.so、.dll&#xff09;。所谓静态…

基于Java SSM框架实现体育竞赛成绩管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现体育竞赛成绩管理系统演示 摘要 体育竞赛是各种体育体育项目比赛的总称。是在裁判员的主持下&#xff0c;按统一的规则要求&#xff0c;组织与实施的体育员个体或体育队之间的竞技较量&#xff0c;是竞技体育与社会发生关联&#xff0c;并作用于社会的媒…

Java网络爬虫--HttpClient

目录标题 技术介绍有什么优点&#xff1f;怎么在项目中引入&#xff1f; 请求URLEntityUtils 类GET请求带参数的GET请求POST请求 总结 技术介绍 HttpClient 是 Apache Jakarta Common 下的子项目&#xff0c;用来提供高效的、功能丰富的、支持 HTTP 协议的客户端编程工具包。相…

2023年全国职业院校技能大赛软件测试赛题—单元测试卷⑧

单元测试 一、任务要求 题目1&#xff1a;根据下列流程图编写程序实现相应处理&#xff0c;执行j10*x-y返回文字“j1&#xff1a;”和计算值&#xff0c;执行j(x-y)*(10⁵%7)返回文字“j2&#xff1a;”和计算值&#xff0c;执行jy*log(x10)返回文字“j3&#xff1a;”和计算值…

3.三极管和MOS管

3.三极管和MOS管 基础知识三极管是电流控制型器件MOS管是电压控制型器件 分类及引脚定义电流导通方向基础应用常用MOS管电平转换电路MOS管实现电平转换用MOS管实现的“I2C总线电平转换电路”&#xff0c;实现3.3V电压域与5V电压域间的双向通讯 基础知识 三极管是电流控制型器件…

【前端性能优化】如何取消http请求

文章目录 需要取消http请求的3种经典场景原生XMLHttpRequest取消http请求fetch取消http请求axios取消http请求哪些情况需要取消HTTP请求取消http请求能带来哪些性能提升 需要取消http请求的3种经典场景 场景一&#xff1a;有一个实时搜索功能&#xff0c;每当用户输入内容改变的…

ES API 批量操作 Bulk API

bulk 是 elasticsearch 提供的一种批量增删改的操作API。 bulk 对 JSON串 有着严格的要求。每个JSON串 不能换行 &#xff0c;只能放在同一行&#xff0c;同时&#xff0c; 相邻的JSON串之间必须要有换行 &#xff08;Linux下是\n&#xff1b;Window下是\r\n&#xff09;。bul…