【优选算法之哈希表】No.11--- 经典哈希表算法

news2024/11/19 9:24:51

文章目录

  • 前言
  • 一、哈希表简介
    • 1.1 什么是哈希表
    • 1.2 哈希表的用途
    • 1.3 什么时候使用哈希表
    • 1.4 怎么用哈希表
  • 二、哈希表示例
    • 2.1 两数之和
    • 2.2 判定是否互为字符重排
    • 2.3 存在重复元素
    • 2.4 存在重复元素 II
    • 2.5 字⺟异位词分组


前言

在这里插入图片描述

👧个人主页:@小沈YO.
😚小编介绍:欢迎来到我的乱七八糟小星球🌝
📋专栏:优选算法
🔑本章内容:哈希表
记得 评论📝 +点赞👍 +收藏😽 +关注💞哦~


一、哈希表简介

1.1 什么是哈希表

‌‌哈希表是一种根据关键码值而直接进行访问的数据结构‌,也被称为‌散列表。它通过一个称为散列函数的映射函数,将关键码值映射到表中的一个位置,以此来访问记录,从而加快查找的速度。这个映射函数将任意给定的关键字值key代入后,若能得到包含该关键字的记录在表中的地址,则称该表为哈希表,而这个映射函数则为哈希函数。

1.2 哈希表的用途

哈希表的主要作用是提供快速的插入、查找和删除操作。它的工作原理基于一个固定的数组,通过哈希函数计算得到一个‌索引值,这个索引值直接指向数组中的位置,从而实现对数据的快速访问。

1.3 什么时候使用哈希表

频繁查找某一个数的时候可以使用哈希表当然二分也可以但是二分限制太多了

1.4 怎么用哈希表

  • 容器(哈希表)
  • 用数组模拟简易哈希(使用场景包括但不限于:1.字符串的字符 2.数据范围很小的时候)

二、哈希表示例

2.1 两数之和

  1. 题⽬链接:1. 两数之和
  2. 题⽬描述:
    在这里插入图片描述
  3. 解法(哈希表):
    算法思路:
    • 如果我们可以事先将「数组内的元素」和「下标」绑定在⼀起存⼊「哈希表」中,然后直接在哈希表中查找每⼀个元素的 target - nums[i] ,就能快速的找到「⽬标和的下标」。
    • 这⾥有⼀个⼩技巧,我们可以不⽤将元素全部放⼊到哈希表之后,再来⼆次遍历(因为要处理元素相同的情况)。⽽是在将元素放⼊到哈希表中的「同时」,直接来检查表中是否已经存在当前元素所对应的⽬标元素(即 target - nums[i] )。如果它存在,那我们已经找到了对应解,并⽴即将其返回。⽆需将元素全部放⼊哈希表中,提⾼效率。
    • 因为哈希表中查找元素的时间复杂度是 O(1) ,遍历⼀遍数组的时间复杂度为 O(N) ,因此可以将时间复杂度降到 O(N) 。
    这是⼀个典型的「⽤空间交换时间」的⽅式。
  4. C++代码
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 ret=target-nums[i];
            //判断索引在不在,在就返回
            if(hash.count(ret))return {hash[ret],i};
            hash[nums[i]]=i;
        }
        return {-1,-1};
    }
};

2.2 判定是否互为字符重排

  1. 题⽬链接:⾯试题 01.02. 判定是否互为字符重排
  2. 题⽬描述:
    在这里插入图片描述
  3. 解法(哈希表):
    算法思路:
  • 当两个字符串的⻓度不相等的时候,是不可能构成互相重排的,直接返回 false ;
  • 如果两个字符串能够构成互相重排,那么每个字符串中「各个字符」出现的「次数」⼀定是相同的。因此,我们可以分别统计出这两个字符串中各个字符出现的次数,然后逐个⽐较是否相等即可。这样的话,我们就可以选择「哈希表」来统计字符串中字符出现的次数。
  1. C++代码
class Solution {
public:
    bool CheckPermutation(string s1, string s2) 
    {
        if(s1.size()!=s2.size())return false;
        int hash[26];
        for(auto&e:s1)
        hash[e-'a']++;
        for(auto& e:s2)
        {
            if(hash[e-'a'])hash[e-'a']--;
            else return false;
        }
        return true;
    }
};

2.3 存在重复元素

  1. 题⽬链接:217. 存在重复元素
  2. 题⽬描述:
    在这里插入图片描述
  3. 解法(哈希表):
    算法思路:
    分析⼀下题⽬,出现「⾄少两次」的意思就是数组中存在着重复的元素,因此我们可以⽆需统计元素出现的数⽬。仅需在遍历数组的过程中,检查当前元素「是否在之前已经出现过」即可。
    因此我们可以利⽤哈希表,仅需存储数「组内的元素」。在遍历数组的时候,⼀边检查哈希表中是否已经出现过当前元素,⼀边将元素加⼊到 哈希表中。
  4. C++代码
class Solution {
public:
    bool containsDuplicate(vector<int>& nums) 
    {
        unordered_map<int,int> hash;
        for(auto&e:nums)
        {
            hash[e]++;
            if(hash[e]>=2)return true;
        }
        return false;
    }
};

2.4 存在重复元素 II

  1. 题⽬链接:219. 存在重复元素 II

  2. 题⽬描述:
    在这里插入图片描述

  3. 解法(哈希表):
    算法思路:
    解决该问题需要我们快速定位到两个信息:
    • 两个相同的元素;
    • 这两个相同元素的下标。
    因此,我们可以使⽤「哈希表」,令数组内的元素做 key 值,该元素所对应的下标做 val 值,将「数组元素」和「下标」绑定在⼀起,存⼊到「哈希表」中。
    思考题:
    如果数组内存在⼤量的「重复元素」,⽽我们判断下标所对应的元素是否符合条件的时候,需要将不同下标的元素作⽐较,怎么处理这个情况呢?
    答:这⾥运⽤了⼀个「⼩贪⼼」。
    我们按照下标「从⼩到⼤」的顺序遍历数组,当遇到两个元素相同,并且⽐较它们的下标时,这两个
    下标⼀定是距离最近的,因为:
    • 如果当前判断符合条件直接返回 true ,⽆需继续往后查找。
    • 如果不符合条件,那么前⼀个下标⼀定不可能与后续相同元素的下标匹配(因为下标在逐渐变⼤),那么我们可以⼤胆舍去前⼀个存储的下标,转⽽将其换成新的下标,继续匹配。

  4. C++代码

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])&&i-hash[nums[i]]<=k)return true;
            hash[nums[i]]=i;
        }
        return false;
    }
};

2.5 字⺟异位词分组

  1. 题⽬链接:49. 字⺟异位词分组
  2. 题⽬描述:
    在这里插入图片描述
  3. 解法(哈希表 + 排序):
    算法思路:
    互为字⺟异位词的单词有⼀个特点:将它们「排序」之后,两个单词应该是「完全相同」的。所以,我们可以利⽤这个特性,将单词按照字典序排序,如果排序后的单词相同的话,就划分到同⼀组中。
    这时我们就要处理两个问题:
    • 排序后的单词与原单词需要能互相映射;
    • 将排序后相同的单词,「划分到同⼀组」;
    利⽤语⾔提供的「容器」的强⼤的功能就能实现这两点:
    • 将排序后的字符串( string )当做哈希表的 key 值;
    • 将字⺟异位词数组( string[] )当成 val 值。
    定义⼀个「哈希表」即可解决问题。
  4. C++代码
class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) 
    {
        unordered_map<string,vector<string>>hash;
        for(int i=0;i<strs.size();i++)
        {
            string tmp=strs[i];
            sort(tmp.begin(),tmp.end());
            hash[tmp].push_back(strs[i]);
        }
        vector<vector<string>> vv;
        for(auto&[x,y]:hash)
        {
            vv.push_back(y);
        }
        return vv;
    }
};

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

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

相关文章

重置linux后vscode无法再次使用ssh连接

如果你使用过vscode ssh远程连接了一个Linux系统&#xff0c;但该系统被重置了&#xff0c;并且关键配置没有改变。再次使用vscode连接时&#xff0c;vscode可能无法连接。 原因&#xff1a;vscode远程连接后会在C:\Users{{你的用户名}}.ssh下的known_hosts和known_hosts.old。…

C0008.Clion利用C++开发Qt界面,使用OpenCV时,配置OpenCV方法

安装OpenCV 配置环境 配置Clion中的CMakeLists.txt文件 # 设置OpenCV的安装路径 set(OpenCV_DIR "D:/OpenCv_Win/opencv/build/x64/vc16/lib")# 查找OpenCV包 find_package(OpenCV REQUIRED)下面添加的CMakeLists.txt文件中主要是添加了后面的${OpenCV_LIBS} # 链接…

Innodb磁盘结构

系统表空间 系统表空间的作用 存系统表中的数据存数据字典————保存系统变量和状态变量存变更缓冲区中未来得及落盘的数据 系统表空间文件位置 系统表可以对应磁盘上的多个表空间文件&#xff0c;默认情况下服务器在数据目录下创建一个名为ibdata1的文件 可以通过改变系…

解决方法:PDF文件打开之后不能打印?

打开PDF文件之后&#xff0c;发现文件不能打印&#xff1f;这是什么原因&#xff1f;首先我们需要先查看一下自己的打印机是否能够正常运行&#xff0c;如果打印机是正常的&#xff0c;我们再查看一下&#xff0c;文件中的打印功能按钮是否是灰色的状态。 如果PDF中的大多数功…

React 解释常见的 hooks: useState / useRef / useContext / useReducer

前言 如果对 re-render 概念还不清楚&#xff0c;建议先看 React & 理解 re-render 的作用、概念&#xff0c;并提供详细的例子解释 再回头看本文。 如果对 React 基础语法还不熟练&#xff0c;建议先看 React & JSX 日常用法与基本原则 再回头看本文。 useState useS…

虚幻引擎-设置UI自适应屏幕大小

在游戏中&#xff0c;如果想实现不同分辨率下&#xff0c;都可以支持当前的UI界面布局&#xff0c;都需要用到锚点功能。 ‌虚幻引擎中的UI锚点&#xff08;Anchor&#xff09;是指控件在屏幕或父物体上的固定点&#xff0c;用于确定控件的位置和布局。‌ 锚点的作用是确保UI元…

【LLM】手搓一个LLM Eval

文章目录 手搓一个LLM Eval项目的动机评测流程概述支持的数据集与评测指标详细的评测过程1. 生成式任务的F1评分1.1 模型推理1.2 结果评测 2. 思考 &#x1f680; 如何运行1. 运行模型推理2. 运行评测 支持的评测指标支持自定义评测学习总结 手搓一个LLM Eval TinyEval&#x…

B. Brightness Begins Codeforces Round 976 (Div. 2)

原题 B. Brightness Begins 解析 Hint 1 第 i 个灯泡最终状态与 n 的大小无关 Hint 2 第 i 个灯泡最终状态与 i 的约数数量的奇偶性相关 Solution 对任意灯泡 i , 它的最终状态由其约数数量的奇偶性相关, 如果 i 有偶数个约数, 那么会是亮的, 否则会是暗的. 换句话说, 如…

第四届高性能计算与通信工程国际学术会议(HPCCE 2024)

目录 大会简介 主办单位&#xff0c;承办单位 征稿主题 会议议程 参会方式 大会官网&#xff1a;www.hpcce.net 大会简介 第四届高性能计算与通信工程国际学术会议&#xff08;HPCCE 2024&#xff09;将于2024年11月22-24日在苏州召开。HPCCE 2024将围绕“高性能计算与通信工…

回归预测 | Matlab基于SABO-SVR减法平均算法优化支持向量机的数据多输入单输出回归预测

回归预测 | Matlab基于SABO-SVR减法平均算法优化支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab基于SABO-SVR减法平均算法优化支持向量机的数据多输入单输出回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab基于SABO-SVR减法平均算法优化…

CSP-J Day 1 模拟赛补题报告

姓名&#xff1a;王胤皓&#xff0c;校区&#xff1a;和谐校区&#xff0c;考试时间&#xff1a;2024年10月1日9:00:00~12:30:00&#xff0c;学号&#xff1a;S07738 CSP-J Day 1 模拟赛补题报告 前言 考了我们班 Rank 1 1 1。 本人在发烧状态下进行写作&#xff0c;勿喷。…

MySQL 问题小结

mysqld --initialize 初始化 data 文件夹 初始化的密码在这个 err 文件夹中

力扣题解 983

大家好&#xff0c;欢迎来到无限大的判断&#xff0c;祝大家国庆假期愉快 题目描述&#xff08;中等&#xff09; 最低票价 在一个火车旅行很受欢迎的国度&#xff0c;你提前一年计划了一些火车旅行。在接下来的一年里&#xff0c;你要旅行的日子将以一个名为 days 的数组给出…

AI学习记录 -transformer 中对于torch和numpy常用函数的使用方式

在transformer源码中&#xff0c;使用了很多矩阵变换的方法&#xff0c;这些方法太多了&#xff0c;了解底层也没啥意义&#xff0c;也不是啥特别复杂的算法。 所以争取一句话描述这些方法&#xff0c;对照着看transformer的时候&#xff0c;可以衔接自己的思维链。 torch.un…

python访问SQL数据库

Step 1 创建一个数据库 Step 2 安装mysql-connector-python pip install mysql-connector-pythonStep 3 访问mysql,并查询表 import mysql.connectordef connect_and_query():try:# 连接到MySQL数据库connection mysql.connector.connect(hostlocalhost, # 数据库主机…

闯关训练一:Linux基础

闯关任务&#xff1a;完成SSH连接与端口映射并运行hello_world.py 1.创建开发机 2.SSH连接 3. VS-Code 连接 选择 Linux 平台 &#xff0c;输入密码 &#xff0c;选择进入文件夹 4.端口映射 按照下文安装Docs pip install gradio 运行server.py import gradio as grdef …

Python核心知识:pip使用方法大全

什么是 pip&#xff1f; pip 是 Python 的包管理工具&#xff0c;允许用户安装、升级和管理 Python 的第三方库和依赖。它极大地简化了开发过程&#xff0c;使开发者可以轻松地获取并安装所需的软件包。pip 已成为 Python 项目中最常见的包管理工具&#xff0c;并且自 Python …

【Linux】几种常见配置文件介绍

配置文件目录 linux 系统中有很多配置文件目录/etc/systemd/system、/lib/systemd/system 以及/usr/lib/systemd/system 等&#xff0c;这三者有什么样的关系呢&#xff1f; 以下是网络上找的资料汇总&#xff0c;并加了一些操作验证。方便后期使用 介绍 目录/lib/systemd/s…

虚拟机窗口顶部和底部出现白边(鸿蒙开发)

预览窗口顶部和底部出现白边 问题描述&#xff1a;预览窗口顶部和底部都有白边&#xff0c;导致无法全屏显示 解决方法&#xff1a; 官方文档&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs-V5/faqs-previewer-operating-6-V5 这里官方文档给了两种…

【有啥问啥】AI中的数据融合(Data Fusion):让数据“1+1>2”

AI中的数据融合&#xff08;Data Fusion&#xff09;&#xff1a;让数据“11>2” 引言 在人工智能&#xff08;AI&#xff09;的浪潮中&#xff0c;数据作为驱动创新的核心要素&#xff0c;其重要性不言而喻。随着物联网&#xff08;IoT&#xff09;、传感器技术和云计算的…