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

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

💓博主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;elsehash.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.mzph.cn/news/812768.shtml

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

相关文章

[yotroy.cool]Haskell笔记一 —— 入门 算数 运算符 未定义变量 列表 字符串 类型

个人博客https://www.yotroy.cool/&#xff0c;欢迎关注我哦&#xff5e; 添加模块 ghci> :module Data.Ratio算数 - * / ** ^ % 基本的 ghci> 7.0 / 2.0 3.5 ghci> 7 / 2 3.5ghci> 2 2 4 ghci> () 2 2 4** 和 ^ - ** 可用于浮点数幂 ghci> 2.2**3.3 …

分治法python

分治法(Divide and Conquer)是一种重要的算法设计技巧,它将一个难以直接解决的问题分解成两个或更多的相同或相似的子问题,递归地解决这些子问题,然后将子问题的解组合起来,从而解决原问题。 以求最大值为例,假设我们有一个整数数组,我们想找到数组中的最大值。使用分…

mutable关键字的作用(c++)

常成员变量、常成员函数与常对象 常成员变量 声明为常成员变量的成员变量&#xff0c;在对象被创建后就不能被修改常成员变量必须在对象的构造函数初始化列表中赋值&#xff0c;不能在构造函数体中赋值初始化列表的执行是在函数体执行之前就执行了的。上面这种写法和下面的写…

卫星遥感影像在农业方面的应用及评价

一、引言 随着科技的进步&#xff0c;卫星遥感技术在农业领域的应用越来越广泛。卫星遥感技术以其宏观、快速、准确的特点&#xff0c;为农业生产和管理提供了有力的技术支撑。本文将对卫星遥感在农业方面的应用进行详细介绍&#xff0c;并通过具体案例进行说明。 二、…

(二)ffmpeg 下载安装以及拉流推流示例

一、ffmpeg下载安装 官网&#xff1a;https://www.ffmpeg.org/ 源码下载地址&#xff1a;https://www.ffmpeg.org/download.html#releases 下载源码压缩包 下载完成之后解压并在该目录下打开命令窗口 安装依赖环境&#xff1a; sudo apt-get install build-essential nasm …

【CAD建模号】学习笔记(二)——工作区

工作区介绍 工作区由[工具提示]&#xff0c;[自适应网格]&#xff0c;[自适应坐标轴]&#xff0c;[参考坐标轴]&#xff0c;[绘制的图形]组成。 一、工具提示 工具提示是提示当前工具的操作步骤&#xff0c;同时也提供了更加精确的参数输入方式建模、绘图时直接生成面&#x…

规则系统架构

规则系统架构 目录概述需求&#xff1a; 设计思路实现思路分析1.规则系统架构2. 规则系统架构优势 性能参数测试&#xff1a; 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,mak…

计算机常识

常见屏幕比例&#xff1a;16&#xff1a;9和16&#xff1a;10 分辨率&#xff1a;屏幕上水平和垂直方向的像素数量&#xff0c;决定了屏幕显示图像的细致程度和清晰度 简称 HD(High Definition)&#xff1a;高清 FHD(Full High Definition)&#xff1a;全高清 QHD (Quarter H…

Linux防止暴力破解密码脚本

1.认识记录linux记录安全的日志 [roottestpm ~]# cd /var/log/ [roottestpm log]# ls | grep secure secure 2.该日志的内容查看 [roottestpm log]# tail -f secure #表示ssh身份验证失败 Aug 29 23:35:03 testpm sshd[111245]: pam_unix(sshd:auth): authentication fa…

Java内存泄漏内存溢出

1.定义 OOM内存溢出是指应用程序尝试使用更多内存资源&#xff0c;而系统无足够的内存&#xff0c;导致程序崩溃。 内存泄漏是指应用程序中分配的内存未能被正确释放&#xff0c;导致系统中的可用内存逐渐减少。 2.内存泄漏的原因 可能包括对象引用未被释放、缓存未被清理等。 …

【MYSQL】其他索引的创建使用方式

MySQL其他索引的创建使用方式 前面的案例中&#xff0c;聊到了咱们有三种方式创建索引&#xff0c;在创建时可通过INDEX、KEY两个关键字创建&#xff0c;但这种方式建立的索引仅是普通索引&#xff0c;接着再来聊一聊MySQL数据库其他类型的索引该如何创建以及使用。 但不管是何…

3D应用模型信创系统实时渲染有什么要求?

实时云渲染技术是数字孪生领域&#xff0c;比较常用的轻量化软件交付方式&#xff0c;该技术是将3D应用等大模型的算力执行放在了服务器端&#xff0c;而服务器目前比较常用的还是Windows系统。但随着国产信创在数字孪生领域应用越来越多&#xff0c;实时云渲染平台的国产信创化…

学习基于pytorch的VGG图像分类 day4

注&#xff1a;本系列博客在于汇总CSDN的精华帖&#xff0c;类似自用笔记&#xff0c;不做学习交流&#xff0c;方便以后的复习回顾&#xff0c;博文中的引用都注明出处&#xff0c;并点赞收藏原博主. 目录 VGG模型检测 一&#xff1a;导入必要的库和模块 二&#xff1a;主函数…

Games101Homework【6】Acceleration structure(Including framework analysis)

Code Analysis&#xff1a; friend&#xff1a; C中友元&#xff08;友元函数和友元类&#xff09;的用法和功能_friend class a<b>-CSDN博客 [C&#xff1a;不如Coding]&#xff08;11&#xff09;&#xff1a;友元函数与友元类_哔哩哔哩_bilibili Here is a simple…

Rust开发笔记 | 系统编程的守护神

在如今这个信息技术不断发展的时代&#xff0c;系统编程语言演进的步伐从未停歇。Rust&#xff0c;作为现代化的系统编程语言&#xff0c;正凭借其出色的性能、安全性和并发处理能力赢得编程界的广泛赞誉。有别于传统的系统编程语言&#xff0c;Rust在保证高性能的同时&#xf…

二维数组---刷题

一维数组不想更了&#xff0c;弄点二维数组&#xff01; 1.对角线 已知一个6*6的矩阵&#xff0c;把矩阵两条对角线上的元素加上10&#xff0c;然后输出这个新矩阵。 思路 题目简单&#xff0c;6*636&#xff0c;可以得知有36个元素。数组就定义成a[7][7]&#xff0c;难点在与…

软考数据库---3.关系数据库

3.1 名词 属性分类 数据库实体属性分类主要包括以下几个方面&#xff1a; 标识属性 (Key Attribute / Identifier): 这些属性是用来唯一识别实体实例的关键属性&#xff0c;也称为主键&#xff08;Primary Key&#xff09;。在数据库表中&#xff0c;每个实体的实例&#xff0…

Linux--gcc和g++的区别

gcc 和 g 都是 GNU 编译器套件&#xff08;GNU Compiler Collection&#xff09;中的一部分&#xff0c;但它们用于编译不同类型的源代码。 gcc: gcc 是 GNU C Compiler 的缩写&#xff0c;主要用于编译 C 语言源代码。它能够将 C 代码编译成可执行程序或者目标代码。 g: g 是…

深入解析实时数仓Doris:介绍、架构剖析、应用场景与数据划分细节

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! Doris是一款高性能、开源的实时分析数据仓库&#xff0c;旨在为用户提供毫秒级查询响应、高并发、高可用以及易于扩展的OLAP解决方…

【深度学习实战(5)】使用OPENCV库实现自己的letter_box操作

一、letter_box 深度学习模型输入图片的尺寸为正方形&#xff0c;而数据集中的图片一般为长方形&#xff0c;粗暴的resize会使得图片失真&#xff0c;采用letterbox可以较好的解决这个问题。该方法可以保持图片的长宽比例&#xff0c;剩下的部分采用灰色填充。 二、代码 本例…