【优选算法专栏】专题十:哈希表(一)

news2024/11/25 14:50:44

本专栏内容为:算法学习专栏,分为优选算法专栏,贪心算法专栏,动态规划专栏以及递归,搜索与回溯算法专栏四部分。 通过本专栏的深入学习,你可以了解并掌握算法。

💓博主csdn个人主页:小小unicorn
⏩专栏分类:算法从入门到精通
🚚代码仓库:小小unicorn的代码仓库🚚
🌹🌹🌹关注我带你学习编程知识

专题十

  • 哈希表简介
    • 什么时候用哈希表?
    • 怎么用哈希表?
  • 面试题 01.02. 判定是否互为字符重排
    • 算法原理:
  • 存在重复元素
    • 算法原理:
  • 存在重复元素 II
    • 算法原理:
  • 字母异位词分组
    • 算法原理:

哈希表简介

在介绍本专题前,我们先介绍一下什么是哈希表

哈希表就是一个容器,它的用途就是可以快速查找元素,它的时间复杂度是O(1)级别,空间复杂度就是O(N)也就是用空间换时间。

什么时候用哈希表?

介绍了什么是哈希表,那么什么时候可以用哈希表?
记住一点,当我们要频繁的进行查找某一个数的时候,这时候我们就可以考虑用哈希表。当然提到查找也不要忘了我们之前学过的二分算法,也可用来查找元素。
在这里插入图片描述

怎么用哈希表?

提到怎么用,通常情况下容器里面的哈希表我们可以直接拿来用,其次就是我们可以用一个数组来模拟哈希表。
在这里插入图片描述
通常会用在两个场景,一是在处理字符串中的字符的时候,我们可以用数组来建议模拟哈希表,方便做到快速查找。
其次当数据量很小的时候,我们也可以直接考虑用数组来模拟哈希表。

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

题目来源:Leetcode面试题 01.02. 判定是否互为字符重排
给定两个由小写字母组成的字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
在这里插入图片描述

算法原理:

在判断字符重不重排,首先我们要先判断这两个字符串的长度是否一致,长度都不一致,肯定无法重排。

判断两个字符串能否构成重排,最暴力就是直接仍在两个哈希表里,然后判断这两个哈希表是否相等,但是这样太麻烦了。
我们可以进行优化,用数组模拟哈希表,因为全都是小写字母,那么我们直接开一个大小为26的一个字符数组。

遍历第一个数组,碰到一个字母就对应++,然后遍历第二个数组,碰到对应字符数组中字母相同就对应–。同时,判断数组下标,如果说下标<0了,那就说明,该字符在第一个数组中就不存在,不能构成重排。
在这里插入图片描述

代码实现:

class Solution 
{
public:
    bool CheckPermutation(string s1, string s2) 
    {
        int n=s1.size(),m=s2.size();
        if(n!=m)
            return false;
        
        char hash[26];
        //遍历第一个数组
        for(auto S1:s1)
        {
            hash[S1-'a']++;
        }
        //遍历第二个数组
        for(auto S2:s2)
        {
            hash[S2-'a']--;
            if(hash[S2-'a']<0)
                return false;
        }
        return true;
    }
};

存在重复元素

题目来源:Leetcode217存在重复元素
给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。
在这里插入图片描述

算法原理:

解法用哈希表,
在这里插入图片描述
固定1位置,看1位置前面有没用相同元素,没有就继续向后移动,看2位置前面有没有相同元素,没有就继续向后移动,依次内推。

代码实现

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

存在重复元素 II

题目来源:Leetcode219存在重复元素 II
给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。
在这里插入图片描述

算法原理:

本题跟上一题的思路基本一样,但是本题要保证两个相同元素的下标差的绝对值要小于K。
在这里插入图片描述
哈希表里面第一个存nums[i]用来判断有没有重复元素,第二个存对应的下标。因为要判断下标关系是否符合要求。跟第一题私立基本一样,固定一个数,看前面有没有重复元素。
没有就向右移动。

代码实现:

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

字母异位词分组

题目来源:49.字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

在这里插入图片描述

算法原理:

先把题目例子分析一遍,可以将例子进行分组。
最后把每个组输出即可。
在这里插入图片描述

  1. 那么如何判断两个字符串是否是字母异位词呢?
    这里我们可以排序,我们将字符串排完序,如果可以字母异位,那么他们排完序后的ASLL码值肯定都是一样的。

2.如何进行分组?
这里我们就要合理用我们的哈希表。
我们将key定义为string,将val定义为字符串数组。
在这里插入图片描述
遍历字符串数组,遍历第一个字符排序,然后看在不在哈希表,不在就加入到key,和val,然后遍历第二个字符串,排完序,看跟哈希表里面key匹不匹配,匹配就加入到val,循环此过程,遍历完整个字符串数组后,把哈希表里面的val全部取出来即可。

代码实现:

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

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

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

相关文章

【springboot开发】MVC和SSM

前言&#xff1a;关于MVC和SSM基本内容的梳理&#xff0c;以及两者之间的关系。 文章目录 1. 三层架构2. MVC3. SSM 1. 三层架构 三层架构是指&#xff1a; 视图层view&#xff08;表现层&#xff09;: 用于显示数据和接收用户输入的数据&#xff0c;为用户提供一种交互式操作…

cpufreq --- 漏洞

我在12日早上发现并上传该漏洞到mainlist&#xff0c; 被毫无道德底线和丑恶人性的印度人截胡了. 这个贪婪、自私的印度人看了我的patch后首先说了一封冠冕堂皇的邮件给我让我不要再次修复&#xff0c;下午2点&#xff0c;人性的丑恶在这厮身上全部散发出来了&#xff0c;它用另…

Unity中图片和Base64字符串之间的转换

大家好&#xff0c;我是阿赵。   这次来讲一下在unity引擎里面&#xff0c;图片和base64字符串的互相转换问题。 一、图片传输的多种方式 有时候我们需要把图片通过网络传输发送。   在Unity里面&#xff0c;有不止一种方式可以实现&#xff0c;比如说&#xff0c;把图片的…

HarmonyOS4 页面路由

Index.ets: import router from ohos.routerclass RouterInfo {// 页面路径url: string// 页面标题title: stringconstructor(url: string, title: string) {this.url urlthis.title title} }Entry // 入口組件 Component struct Index {State message: string 页面列表// …

java快速幂算法

快速幂算法 参考视频(参考五角七边up大佬&#xff09; 幂运算的介绍 幂运算是指将一个数自身乘以自身多次的运算&#xff0c;其表达式为 a n a^n an&#xff0c;其中 a a a 是底数&#xff0c; n n n 是指数。 快速幂解释 快速幂算法是一种用于快速计算幂运算的算法&…

MySQL的基础操作(二)

目录 一.数据库约束 1.主键约束 (Primary Key) 2.唯一约束 (Unique) 3.外键约束 (Foreign Key): 4.检查约束(Check) 5.默认约束 (Default) 二.聚合查询 1.简单聚合函数 2.GROUP BY子句 3.HAVING子句 三.联合查询 1.内连接 2.左连接 3.右连接 4.子查询 5.合并查询…

OpenHarmony开发——CMake方式组织编译的库移植

概述 本文为OpenHarmony开发者提供一些组织编译形式比较常见&#xff08;CMakeLists、Makefile&#xff09;的三方库的移植指南&#xff0c;该指南当前仅适用于Hi3516DV300和Hi3518EV300两个平台&#xff0c;文中着重介绍各编译组织方式下工具链的设置方法以及如何将该库的编译…

NJU PA0

NJU PA0 使用教程提供的源再进行sudo apt install … 可能会出现 Unmet dependencies 此类报错 可以安装 aptitude sudo apt install aptitude sudo aptitude install <package>然后它会提示你&#xff0c;选 n 进行降级。再选 Y 确认 或者 将 /etc/apt/sources.list 下…

SpringSecurity登录时在哪里调用我们自定义的UserDetailsServiceImpl

SpringSecurity登录时在哪里调用我们自定义的UserDetailsServiceImpl 1、请求login方法 2、将用户的用户名和密码封装成一个对象&#xff0c;以便进行后续的认证操作 3、执行认证操作 4、调用providermanager类的authenticate 5.进入这一步就开始跟我们自定义实现的UserDet…

带头结点的双向循环链表操作集

分数 50 作者 伍建全 单位 重庆科技大学 本题要求实现一个带头结点的双向循环链表操作集。 函数接口定义&#xff1a; typedef int dataType;typedef struct _node {dataType data;struct _node *prev;//指向前驱的指针struct _node *next;//指向后继的指针 }node;typedef…

Windows安装MongoDB结合内网穿透轻松实现公网访问本地数据库

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

PandasAI的应用与实战解析(二):PandasAI使用流程与功能介绍

文章目录 1.使用PandasAI进行开发的流程2.配置文件解析3.支持的数据库类型4.支持的LLMs5.其他 PandasAI这个工具最突出的优点就是通过结合了Pandas和生成式LLMs&#xff0c;极大地为开发人员降低了工作量。 传统的开发调用流程&#xff08;数据分析相关&#xff09;&#xff1a…

秒杀购物商城核心服务 — 商品管理中心(前提设计概要)

秒杀购物商城核心服务 前提介绍商品中心中台支持系统-总体架构设计&#xff1a;商品与产品商品 类目属性类目定义前后台类目后台类目&#xff0c;关注标准化管理类目属性及分类 SKUSPU 属性库建设 前提介绍 在电商系统中&#xff0c;商品模型占据着举足轻重的地位&#xff0c…

AI赋能档案开放审核:实战

关注我们 - 数字罗塞塔计划 - 为进一步推进档案开放审核工作提质增效&#xff0c;结合近几年的业务探索、研究及项目实践&#xff0c;形成了一套较为成熟、高效的AI辅助档案开放审核解决方案&#xff0c;即以“AI人工”的人机协同模式引领档案开放审机制创新&#xff0c;在档…

TyG新文章!与胸痛的高发生率正相关 | NHANES数据库周报(4.10)

NHANES挖掘培训班来啦&#xff0c;就在4.20-21&#xff01; 郑老师团队2024年NHANES公共数据库挖掘培训班&#xff0c;由浅入深&#xff0c;零基础可学&#xff0c;欢迎报名&#xff01; 美国国家健康和营养检查调查&#xff08;NHANES&#xff09;是一项旨在评估美国成人和儿童…

Python通过socket搭建一个web服务器

目录 01、源码 02、运行结果 03、小结 Socket是一种计算机网络通信的一种机制&#xff0c;它允许不同计算机或进程之间通过网络进行数据传输和通信。Socket可以被看作是不同计算机之间的数据传输通道&#xff0c;通过这个通道&#xff0c;计算机之间可以进行双向的数据传输。…

区块链游戏:探索未来的可能性与挑战

区块链游戏是一种将区块链技术应用于游戏领域的创新产品&#xff0c;它为游戏行业带来了全新的模式和可能性。本文将深入探讨区块链游戏的优点、挑战和未来趋势&#xff0c;帮助读者了解这一新兴领域。 一、区块链游戏的优点 1. 公平性&#xff1a;区块链技术保证了游戏中的物…

LeetCode-Java:303、304区域检索(前缀和)

文章目录 题目303、区域和检索&#xff08;数组不可变&#xff09;304、二维区域和检索&#xff08;矩阵不可变&#xff09; 解①303&#xff0c;一维前缀和②304&#xff0c;二维前缀和 算法前缀和一维前缀和二维前缀和 题目 303、区域和检索&#xff08;数组不可变&#xff…

二叉树遍历算法和应用

二叉树是指度为 2 的树。它是一种最简单却又最重要的树&#xff0c;在计算机领域中有这广泛的应用。 二叉树的递归定义如下&#xff1a;二叉树是一棵空树&#xff0c;或者一棵由一个根节点和两棵互不相交的分别称为根节点的左子树和右子树所组成的非空树&#xff0c;左子树和右…

【数据结构】07查找

查找 1. 基本概念2. 顺序表查找2.1 顺序查找2.2 顺序查找优化-哨兵 3. 有序表查找3.1 折半查找&#xff08;二分查找&#xff09; 4. 分块查找&#xff08;索引顺序查找&#xff09;5. Hash表&#xff08;散列表&#xff09;5.1 散列函数的设计5.2 代码实现5.2.1 初始化Hash表5…