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

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

理论基础点这里


有效的字母异位词

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,期待与你共同进步!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【物联网】继续深入探索ADC模拟转数字的原理——Flash ADC流水线ADC逐次逼近型SAR ADC

这篇文章主要弥补上一篇关于ADC的不足&#xff0c;更加深入了解ADC数模转换器的工作原理&#xff0c;举例常见的三种ADC&#xff0c;分别为Flash ADC&流水线ADC&逐次逼近型SAR ADC。 【物联网】深入了解AD/DA转换技术&#xff1a;模数转换和数模转换 文章目录 一、模拟…

765. 情侣牵手(困难)

首先不考虑已经正确坐在一起的组合在没有坐在一起的组合中&#xff0c;只有当两对情侣互相配对时只需要一次交换操作就可以使得两对情侣完成匹配&#xff0c;其余情况交换数等于情侣对数可以把所有情侣看成一个大集合&#xff0c;这个大集合是可以拆成若干小集合的&#xff0c;…

超全总结!探索性数据分析 (EDA)方法汇总!

探索性数据分析&#xff08;EDA&#xff09;是一种系统地分析、可视化和总结数据集的过程&#xff0c;以获取洞察并更好地理解数据中潜在的模式和趋势。 EDA是任何数据分析项目中的重要步骤&#xff0c;因为它有助于识别数据中的潜在问题和偏见。EDA有助于为建模和进一步分析奠…

08 # 手写 filter 方法

什么是 filter filter() 方法创建给定数组一部分的浅拷贝&#xff0c;其包含通过所提供函数实现的测试的所有元素。如果没有元素通过测试&#xff0c;则返回一个空数组。 ele&#xff1a;表示数组中的每一个元素index&#xff1a;表示数据中元素的索引array&#xff1a;表示数…

.NET快速对接极光消息推送

什么是消息推送&#xff1f; 很多手机APP会不定时的给用户推送消息&#xff0c;例如一些新闻APP会给用户推送用户可能感兴趣的新闻&#xff0c;或者APP有更新了&#xff0c;会给用户推送是否选择更新的消息等等&#xff0c;这就是所谓的“消息推送”。 常见的一些APP消息推送…

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

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

CMakeCache.txt有什么用

2023年11月11日&#xff0c;周六上午 CMakeCache.txt 是由 CMake 自动生成的一个缓存文件&#xff0c;用于记录在配置过程中生成的各种变量和选项的值。 在使用 CMake 构建项目时&#xff0c;CMake 会根据 CMakeLists.txt 文件中的配置和命令&#xff0c;解析项目的源代码并生…

机器学习算法——线性回归与非线性回归

目录 1. 梯度下降法1.1 一元线性回归1.2 多元线性回归1.3 标准方程法1.4 梯度下降法与标准方程法的优缺点 2. 相关系数与决定系数 1. 梯度下降法 1.1 一元线性回归 定义一元线性方程 y ω x b y\omega xb yωxb 则误差&#xff08;残差&#xff09;平方和 C ( ω , b ) …

新生儿夜惊:原因、科普和注意事项

引言&#xff1a; 新生儿夜惊是一种常见的现象&#xff0c;它可能让新父母感到焦虑和不安。夜惊通常表现为婴儿在夜间忽然惊醒、哭闹&#xff0c;并伴随着呼吸急促和肌肉紧张。尽管这在大多数情况下是正常的生理现象&#xff0c;但对于父母来说&#xff0c;了解夜惊的原因和适…

MES系统如何赋能制造企业实现4M防错追溯?

生产过程4M管理和MES系统的结合是现代制造业中关键的质量管理实践&#xff0c;它有助于提高生产效率、降低生产成本并保证产品质量。本文将深入探讨4M管理的概念&#xff0c;以及MES系统如何赋能制造企业实现4M防错追溯。 一、4M管理的概念 4M管理是指在制造过程中管理和控制四…

蓝桥杯算法心得——拼数(排列型回溯dfs)

大家好&#xff0c;我是晴天学长&#xff0c;排列型的dfs&#xff0c;在一些需要暴搜的题中很中很重要&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .拼数 2) .算法思路 超级递归 1.遍历数组&#…

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

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

【Acwing171】送礼物(双向dfs)题解

本题思路来源于acwing算法提高课 题目描述 看本文需要准备的知识 1.二分&#xff08;强烈推荐文章&#xff1a;http://t.csdnimg.cn/Mx9Lr&#xff09; 2.dfs基本思想&#xff0c;了解“剪枝”这个术语 思路分析 首先这道题目看起来就是一个01背包&#xff0c;但是如果直接…

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.…

另辟奚径-Android Studio调用Delphi窗体

大家都知道Delphi能调用安卓SDK&#xff0c;比如jar、aar等&#xff0c; 但是反过来&#xff0c;能在Android Studio中调用Delphi开发的窗体吗&#xff1f; 想想不太可能吧&#xff0c; Delphi用的是Pascal&#xff0c;Android Studio用的是Java&#xff0c;这两个怎么能混用…

QDockWidget组件的隐藏与显示(按钮控制)

本文内容包括&#xff1a; 1、控制按钮的点击效果美化&#xff1b; 2、用按钮控制QDockWidget组件的隐藏与显示&#xff1b; 参考前提&#xff1a;已有.ui文件、已有QDockWidget组件、已有一个控制QDockWidget组件的按钮 实现效果&#xff1a; DockWidget组件的隐藏与显示&…

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…

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

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

SFTP远程终端访问

远程终端访问 当服务器部署好以后&#xff0c;除了直接在服务器上操作&#xff0c;还可以通过网络进行远程连接访问CentOS 7默认支持SSH(Secure Shell, 安全Shell 协议),该协议通过高强度的加密算法提高了数据在网络传输中的安全性&#xff0c;可有效防止中间人攻击(Man-in-th…

软件之禅(七)面向对象(Object Oriented)

黄国强 2023/11/11 前文提到面向对象构建的模块控制器&#xff0c;根据第一性原理&#xff0c;从图灵机的角度&#xff0c;面向对象不是最基本的元素。那么面向对象是不是不重要呢&#xff1f; 答案是否定的&#xff0c;面向对象非常非常重要。当我们面对一个具体的领域…