DAY6 - 哈希表理论基础,242.有效的字母异位词,349. 两个数组的交集,202.快乐数,1.两数之和

news/2025/3/17 16:43:52/文章来源:https://www.cnblogs.com/chloechen/p/18777142

一般哈希表都是用来快速判断一个元素是否出现集合里。

用于实现哈希的数据结构

image-20250317132827772

std::unordered_map 底层实现为哈希表,std::mapstd::multimap 的底层实现是红黑树。同理,std::mapstd::multimap 的key也是有序的(这个问题也经常作为面试题,考察对语言容器底层的理解)。

当我们要使用集合来解决哈希问题的时候,优先使用 unordered_set,因为它的查询和增删效率是最优的,如果需要集合是有序的,那么就用 set,如果要求不仅有序还要有重复数据的话,那么就用 multiset

那么再来看一下map ,在map 是一个key value 的数据结构,map中,对key是有限制,对value没有限制的,因为key的存储方式使用红黑树实现的。

242.有效的字母异位词

用数组作为哈希表。数组本身就自带索引,直接用数组存数据即可。

class Solution {
public:bool isAnagram(string s, string t) {int cnt[26]={0};for(int i=0;i<s.size();i++){cnt[s[i]-'a']++;}for(int i=0;i<t.size();i++){cnt[t[i]-'a']--;}for(int i=0;i<26;i++){if(cnt[i]!=0) return false;}return true;}
};

可以用数组来实现哈希表,因为题目有信息规定了数组(哈希表)大小,比如这个就说都是小写英文字母,26个。

而下面这道题就没有规定哈希表大小,所以就要用set了。

349. 两个数组的交集

对顺序没有要求,所以使用 unorderd_set

class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_set<int> nums_set(nums1.begin(),nums1.end());unordered_set<int> res_set;for(int n:nums2){if(nums_set.find(n)!=nums_set.end()){res_set.insert(n);}}return vector<int>(res_set.begin(),res_set.end());}
};

一些 set 相关语法的写法

  • set.find(num) == set.end() 在set中没有找到该元素

  • set.find(num) != set.end() 在set中找到该元素

  • unordered_set<int> nums_set(nums1.begin(), nums1.end()); 用vector初始化set

  • vector<int>(result_set.begin(), result_set.end()) 类型转换

202.快乐数

题目提到了要么最终变为1要么无限循环,所以如果出现循环的话就可以 return false 了。

一开始出错在 int sum=0; 没有写到循环里面,每次计算完都要将sum置为0,否则sum会一直累加越加越大。

class Solution {
public:bool isHappy(int n) {unordered_set<int> sum_set;while(true){int sum=0;while(n!=0){sum+=n%10*(n%10);n/=10;}if(sum==1) return true;if(sum_set.find(sum)!=sum_set.end()){return false;}else{sum_set.insert(sum);}n=sum;}}
};

1.两数之和

涉及下标还有和,考虑用map,键值对。用sum作为键,value储存vector,下标。尝试遍历一遍解决问题。

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int,int> map;for(int i=0;i<nums.size();i++){if(map.find(target-nums[i])!=map.end()){return {map.find(target-nums[i])->second,i};}map.insert({nums[i],i});}return {};}
}; 

一开始我想复杂了。想的是将sum存入map,value存序号对,但是这样还是要遍历求sum再比较,和暴力计算没有区别。

正确思路:用map存nums数组,遍历数组时看 target-nums[i] 是否在map里面,如果有则返回

注意一些语法:

  • 返回值为 vector<int> 的时候,要写 return {},不能写 return NULL

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

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

相关文章

python运算注意点

1、整除// 9//2得出为4,被除数在前。 取余% 9%2得出1 2、round()函数,表示四舍五入,奇进偶不进 例:round(3.5)为4 round(6.5)为6 3、赋值 多变量赋值,直接用,隔开。 赋值加运算(先运算再赋值,也就是先乘2*3=6,直接赋值给b)4、逻辑运算符有一种优化机制,短…

Bernoulli Equation

伯努利方程 伯努利方程并非一个独立的定律,而是在不同条件下由 Navier-Stokes 动量方程(式1)和能量方程(式2)推导而来的。 \[\rho\left(\frac{\partial u_{j}}{\partial t} + u_{i}\frac{\partial u_{j}}{\partial x_{i}}\right)=-\frac{\partial p}{\partial x_{j}}+\rho…

社区演讲-基于.NET 技术栈的研发过程管理和智能化探索

Hi all 2024年11月23日,我作为【项目管理实践探索者大会】专题讲师,给社区分享了主题《基于.NET 技术栈的研发过程管理和智能化探索》 现场参与人数:100+ 演讲议题介绍: 体系建设:如何设计一个合适的研发过程管理体系 平台提效:通过.NET技术构建任务驱动+流程驱动,释放研…

halcon 深度学习教程(二)halcon基于深度学习的OCR检测

原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/18777081深度学习教程目录如下,还在继续更新完善中 深度学习系列教程目录 本篇非常简单,但是非常好用的OCR识别,传统的OCR识别方法一大堆各种各样的操作,麻烦的要死。halcon 22版本开始支持深度学习OCR,并且…

[ SpringMVC ] SpringMVC如何通过是否有@RestController注解来判断返回ModelAndView还是Json

引言之前在面试的遇到面试官问我SpringMVC的执行流程,我那时候回答的是SpringMVC的DispatcherServlet的dodispatch方法找到ControllerMethod之后将返回值通过convert成Json返回响应体,事后想了一下回答的其实并不正确,因为SpringMVC之前学习的时候有使用ModelAndView返回视图,我…

从HR+AI到AI+HR,企业人力资源AI进程已过半

一、人力资源管理智能化应势而上,核心价值受企业管理层肯定 过往各项研究表明,AI 已经被广泛应用于企业经营的各个环节中。根据易路于2023 年发布的《AI 在企业人力资源中的应用白皮书1.0》(以下简称《白皮书1.0》),我们可以明确感受到:AI 已不同程度应用于招聘管理、员工…

multi-object tracking in the dark

创新点:构建LMOT数据集:开发了一种双摄像头系统,同步采集明暗视频帧,形成高度对齐的低光视频对,并提供高质量的多目标跟踪标注。该数据集包含大量城市户外场景视频,涵盖多种动态物体,为模型训练和评估提供了丰富的数据支持。 提出LTrack方法:引入自适应低通下采样模块(…

LGP11831_1 [UPTS 2025] 追忆 学习笔记

LGP11831_1 [UPTS 2025] 追忆 学习笔记 Luogu Link 前言 又幻想了……唉! 幻想自己场切这道题,最后标准分上升至 \(\text{598pts}\),翻掉了 \(\text{yyz}\),不至于一点脸不要。 本题解基本借鉴这篇题解。 题意简述 给定一个 \(n\) 点 \(m\) 边的简单有向图 \(G\),有 \(m\)…

sql 在两个数据表中,A表存在字段以逗号分隔存储B表的多id对象,进行关联查询

A 表:B表:关联查询 需求为,查询出A表的数据列表,需要将A表关联B表的数据id,概要通过B表的 name 进行输出显示 SELECT A.id,A.name,A.creator,A.created_at,GROUP_CONCAT(B.name SEPARATOR , ) AS B_names -- 将 c_name 合并为逗号分隔的字符串 FROM xf_service_type A LE…

算力市场何以拥有巨大潜力

算力市场未来确实具有巨大的潜力,这一判断基于多个方面的因素: 一、算力成为经济增长的主要驱动力 随着全球数字化转型的迅猛推进,算力已成为推动经济增长的关键引擎。各国纷纷加大在算力基础设施方面的投入,以期为经济发展注入新的活力。例如,欧盟委员会批准了一项名为“…

算法备案拟公示内容编写指南

除了自评估报告,算法备案复审中的拟公示内容也是难度颇大的一份材料,导致很多开发者的算法备案申请被驳回。今天我就提供一份简易模板供大家学习参考(请结合实际情况撰写,不要照抄,不要买模板,否则会判定真实性存疑或高度雷同,影响备案)。(各类文件套模板都会判定该真…

CH585 RF_Basic例程讲解含单向和双向发送

CH585_RF基础通讯例程见下图路径:1、RF初始化参数配置/******************************************************************************** @fn RFRole_Init** @brief RF应用层初始化** @param None.** @return None.*/ void RFRole_Init(void) {rfTaskID = TMOS_…