【算法-哈希表1】哈希表有什么用? 来看看 有效的字母异位词 和 两数组的交集.

news2024/11/20 2:45:27

今天,带来哈希相关算法的讲解。文中不足错漏之处望请斧正!

理论基础点这里


有效的字母异位词

1. 思路

暴力的解法,需要两层for循环,同时还要记录字符是否重复出现,很明显时间复杂度是 O(n^2)。

其实可以用哈希表来解决,哈希就是查找某元素在某集合中是否出现的好办法。

因为只涉及到26个小写字母,所以数组就够用。建立字符和数组下标的映射,记录字符出现次数。

  • 数组下标代表字符
  • 数组下标对应的值代表出现此处
  1. 遍历s和t,记录每个字符出现次数
  2. 遍历数组,查看某字符在两个字符串中的出现次数是否一样

在这里插入图片描述
*动图来源:代码随想录

这样是O(2n+26),即O(n)的时间复杂度。

2. 参考代码

class Solution {
public:
    // 字母异位词:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
    bool isAnagram(string s, string t) {
		//cnt的[0,25]下标本身对应['a','z']
		//cnt的[0,25]的值对应['a','z']的出现次数
        int cnt[26] = {0};
		
		// 遍历两个字符串, 求其元素出现次数, 统计时s对于cnt是加操作, t对于cnt是减操作
		// 如果二者字符出现次数相同, 则cnt的每个元素都应该是0
        for (char &ch : s) ++cnt[ch - 'a'];
        for (char &ch : t) --cnt[ch - 'a'];

        for (int i = 0; i < 26; ++i) if (cnt[i] != 0) return false;

        return true;
    }
};

两个数组的交集

1. 思路

两数组的交集,就是在两数组都出现过的元素。

凡是看到判断集合中某元素是否出现或者统计次数,那就很可能用到哈希表。因为哈希表通过key值和位置建立映射,可以通过key值快速找到对应元素,完成高效的读写。

那我们用什么数据结构来实现哈希表呢?这里用set和数组都可以。因为题目规定,元素大小小于1000,所以数组也能用。

那数组什么时候不合适呢?

当数据分布不集中,就不适合使用数组了,比如存储两个整数0和99999999,需要开辟10000000个int的数组。极大浪费空间。

什么时候数组合适呢?

恰好就是数据分布集中的时候,我们首选数组。因为set和map都是有开销的,作为STL的容器,他需要很多辅助空间来实现功能。说白了就是更复杂,但适用大多数场景。而数组实现的哈希表,场景比较有限;但开销很小,性能高些。

尽管unordered_set和unordered_map的读写复杂度是O(1),但是哈希函数的映射等操作也是有消耗的,数据量大的时候和数组比起来差距还是比较明显的。

但数组在上期用过了,这次主要讲解set。根据题意,我们使用unordered_set最合适,因为它的读写复杂度是O(1)。

2. 参考代码

set实现

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> result; // 存放交集结果, 用set存储可以去重
        unordered_set<int> nums1Set(nums1.begin(), nums1.end());

        for (int &num2 : nums2) {
            if (nums1Set.find(num2) != nums1Set.end()) {
                result.insert(num2);
            }
        }

        return vector<int>(result.begin(), result.end());
    }
};

数组实现

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        bool appeared[1001] = {false}; //保证整数1000也能映射进来
        unordered_set<int> result;
        for(auto &e : nums1) {
            appeared[e] = true;
        }
        for(auto &e : nums2) {
            if(appeared[e] == true) result.insert(e);
        }
        return vector<int>(result.begin(), result.end());
    }
};

今天的分享就到这里了,感谢您能看到这里。

这里是培根的blog,期待与你共同进步!

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

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

相关文章

mac 无法 push 代码到 github 报错:Couldn‘t connect to server 或者 无法克隆 github 仓库 ,克隆进度卡住

开启代理后上传代码报错 Failed to connect to github.com port 443 after 75108 ms: Couldn’t connect to server 解决方法 在 网络 设置里查看代理端口号 开启配置 http、https 全局代理 git config --global http.proxy http://127.0.0.1:你所查询的端口号 git confi…

【安卓13】谷歌原生桌面launcher3源码修改,修改桌面布局(首屏应用、小部件、导航栏、大屏设备任务栏)

前言 近期接到一个关于谷歌EDLA认证的需求&#xff0c;我负责的是谷歌原生桌面布局的修改&#xff0c;通过研究源码&#xff0c;将涉及到了一些修改思路发出来&#xff0c;大家可以参考一下有没有对你有用的信息。主要修改内容有&#xff1a; 1、搜索栏、底部导航栏未居中 2、…

吴恩达《机器学习》7-1->7-4:过拟合问题、代价函数、线性回归的正则化、正则化的逻辑回归模型

一、过拟合的本质 过拟合是指模型在训练集上表现良好&#xff0c;但在新数据上的泛化能力较差。考虑到多项式回归的例子&#xff0c;我们可以通过几个模型的比较来理解过拟合的本质。 线性模型&#xff08;欠拟合&#xff09;&#xff1a; 第一个模型是一个线性模型&#xff0…

熊海CMS 靶场

熊海CMS 靶场 0x01 前言 初步了解cms&#xff0c;Content Management System 内容管理系统。它是一种用于创建、编辑、管理和发布内容的软件程序或工具。内容管理系统通常用于网站、博客、企业内部系统等各种应用中&#xff0c;可以帮助用户管理和发布各种类型的内容&#xf…

Clickhouse学习笔记(5)—— ClickHouse 副本

Data Replication | ClickHouse Docs 副本的目的主要是保障数据的高可用性&#xff0c;即使一台 ClickHouse 节点宕机&#xff0c;那么也可以从其他服务器获得相同的数据 注意&#xff1a; clickhouse副本机制的实现要基于zookeeperclickhouse的副本机制只适用于MergeTree f…

一起看看StatusBarManagerService(一)

写在前面 工作需要涉及到这部分代码&#xff0c;但是我对此了解很少&#xff1b;边学边总结&#xff0c;把这部分逻辑和涉及到的知识点弄明白。该系列不确定几篇&#xff0c;随缘。 本篇主要介绍StatusBarManagerService与systemui之间的关联。 了解StatusBarManagerService …

[Android]_[初级]_[配置gradle的环境变量设置安装位置]

场景 在开发Android项目的时候, gradle是官方指定的构建工具。不同项目通过wrapper指定不同版本的gradle。随着项目越来越多&#xff0c;使用的gradle版本也增多&#xff0c;导致它以来的各种库也增加&#xff0c;系统盘空间不足&#xff0c;怎么解决&#xff1f; 说明 grad…

pyqt环境搭建

创建虚拟环境 # 用管理员身份运行 conda create --prefixE:\Python\envs\pyqt5stu python3.6 # 激活虚拟环境 conda activate E:\Python\envs\pyqt5stu # 退出虚拟环境 conda deactivate安装包 pip install PyQt5 -i https://pypi.douban.com/simple pip install PyQt5-tools…

asp.net学生宿舍管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net 学生宿舍管理系统是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言 开发 asp.net学生宿舍管理系统1 应用技…

CV计算机视觉每日开源代码Paper with code速览-2023.11.8

精华置顶 墙裂推荐&#xff01;小白如何1个月系统学习CV核心知识&#xff1a;链接 点击CV计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【基础网络架构】&#xff08;WACV2024&#xff09;SBCFo…

Spring Cloud学习(四)【Nacos配置管理】

文章目录 统一配置管理微服务配置拉取配置热更新多环境配置共享Nacos 集群搭建Nacos集群搭建1.集群结构图2.搭建集群2.1.初始化数据库2.2.下载nacos2.3.配置Nacos2.4.启动2.5.nginx反向代理2.6.优化 统一配置管理 Nacos 可以实现注册中心和配置管理服务 在Nacos中添加配置信息…

字符串的模式匹配(朴素模式匹配算法,KMP算法)

目录 1.朴素模式匹配算法1.定义2.算法实现3.代码实现 2.KMP算法1.优化思路2.next数组3.代码实现 3.求next数组4.KMP算法优化1.next数组的优化2.求nextval数组 1.朴素模式匹配算法 子串&#xff1a;主串的一部分&#xff0c;一定存在。 模式串&#xff1a;不一定能在主串中找到。…

【算法与数据结构】93、LeetCode复原 IP 地址

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;参照【算法与数据结构】131、LeetCode分割回文串的思路&#xff0c;需要将IP字符串进行分割&#xff0…

js 实现数字滚动效果,从 0 加到目标值,并且重复执行

js 实现数字滚动效果,从 0 加到目标值,并且重复执行 实现效果 js 方法 方法接收的参数 为目标值 const showNumberref(1999) const animateNumber (target: number) > {let current 0const increment (target - current) / (2000 / 16) // 计算每次递增的值&#xff0c…

华硕荣获“EPEAT Climate+ Champion”永续先驱称号

华硕持续深耕永续理念&#xff0c;努力提供低碳排放、高效能产品&#xff0c;并被全球电子委员会授予“EPEAT Climate Champion”称号。这一荣誉再次表明了华硕在永续管理方面的承诺&#xff0c;并凸显了华硕在追求永续发展上的决心。 华硕通过设立“科学基础减碳目标”、“再生…

lv11 嵌入式开发 ARM体系结构理论基础(异常、微架构)4

1 异常概念 处理器在正常执行程序的过程中可能会遇到一些不正常的事件发生 这时处理器就要将当前的程序暂停下来转而去处理这个异常的事件 异常事件处理完成之后再返回到被异常打断的点继续执行程序 2 异常处理机制 不同的处理器对异常的处理的流程大体相似&#xff0c…

一种ADC采样算法,中位值平均滤波+递推平均滤波

前言 在实际AD采集场景中&#xff0c;会出现周期性变化和偶然脉冲波动干扰对AD采集的影响 这里使用中位值平均滤波递推平均滤波的结合 参考前人写好的代码框架&#xff0c;也参考博主GuYH_下面这篇博客&#xff0c;在此基础上稍作修改&#xff0c;写出这篇博客&#xff0c;能…

基于超宽带技术的人员定位系统源码,spring boot+ vue+ mysql定位系统源码

​UWB定位技术源码 超宽带技术的人员定位系统源码 UWB人员定位系统是一种基于超宽带技术的人员定位系统&#xff0c;它通过发送和接收超短脉冲信号&#xff0c;在测距方面可以达到微米级精度。这种系统通常需要具备高精度的定位能力&#xff0c;通常需要达到微米级别&#xff0…

ceph-deploy bclinux aarch64 ceph 14.2.10

ssh-copy-id&#xff0c;部署机免密登录其他三台主机 所有机器硬盘配置参考如下&#xff0c;计划采用vdb作为ceph数据盘 下载ceph-deploy pip install ceph-deploy 免密登录设置主机名 hostnamectl --static set-hostname ceph-0 .. 3 配置hosts 172.17.163.105 ceph-0 172.…

局部路由守卫component守卫

局部路由守卫component守卫 component守卫&#xff08;beforeRouteEnter、beforeRouteLeave&#xff09; 代码位置&#xff1a;在路由组件中&#xff0c;代码是写在component当中的&#xff08;XXX.vue&#xff09;beforeRouteEnter、beforeRouteLeave都有三个参数&#xff1…