哈希表总结

三种哈希结构:
vector:下标为数字。
set:无下标。
map:是一个映射,key为任意类型。
vector封装数组,list封装了链表,map和set封装了二叉树。
set 的使用
要使用集合来解决哈希问题的时候,优先使unordered_set,因为它的查询和增删效率是最优的,如果集合要有序,那么就用set,如果集合要有序且有重复数据的话,那么就用multiset。
使用map与使用set类似。

题目分析:

力扣:242.有效的字母异位词
实现的条件:每一个字母出现的次数是否相等。依次的思路:
①:要使用容器。 (无要求,使用vector普通容器)
②:字母与次数对应。
③:字母可作为下标。

力扣:383.赎金信
在上一题的基础上,同时还需满足a中字符不小于b中字符的个数。

力扣:49.字母异位词分组
将由相同字母组成的字符串放在一起。
①:分类:用sort函数将同一类型不同形式的字符串整合成相同字符串。

用 vector 存储,怎么加入对应的已有类别当中?
怎么加入vector当中?

解决:通过map函数。键为 sort 后的标准字符串,值为vector类型存储一组同一类型不同形式的字符串。

力扣:438.找到字符串中所有字母异位词

通过比较容器相等:来判断两个字符串中字符是否对应。
两题比较(字母异位词的两种比较方式):
移动字符串与标准字符串的比较:通过sort函数比较是否相等。
完整的字符串与标准字符串的比较:通过比较容器是否相等。

力扣:349. 两个数组的交集

判断元素是否在数组中即可。

力扣:350.两个数组的交集 II

①:比较元素
②:元素个数的比较

第一个数组中第几个a出现:123456
第二个数组中第几个a出现:1234
依次遍历第二个数组中的a时,会依次入a。

第一个数组中第几个a出现:123456
第二个数组中第几个a出现:12345678
依次遍历第二个数组中的a时,会依次入a,但当第二个数组出现a的次数大于第一个数组出现a的次数时,不会入a。
(但当第二个数组出现a的次数大于第一个数组出现a的次数时)这个条件如何满足呢:
第一个数组入map,记录了第一个数组中a的个数(即a对应的值),当遍历第二个数组的a时a对应的值会 -1,当a的值为
0时表示第二个数组中a的个数大于等于了第一个数组中a的个数,不能入a了。

力扣:202.快乐数
传入一个值进行函数操作,返回一个值,看此值是否为1,是否重复出现过(运用set容器)。

力扣:1.两数之和

查找与此值互补值是否在容器内,不在则添加此值入容器。

添加与判断同步:只会将一对符合条件的值作为结果的行为做一次。
先全部添加再依次判断:会将一对符合条件的值作为结果的行为做两次,造成重复。

容器的选择
set是一个集合,里面放的元素只能是一个key,无下标。

vector的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。要提前预备空间,很大可能超空间,造成浪费空间。运用map。

力扣:454.四数相加 ||

两种思路:
①:
四重循环遍历所有,满足则++。
②:
两个二重循环,都是遍历所有,看第二个二重循环的值满足的对应值于第一个二重循环中造成的 vector 结果中是否存在。

比较:一个是四次,一个是两个二次(看第二个中是否存在第一个即可)。

力扣:15.三数之和

首先选定一个数,然后运用二分查找寻找两边界值之和为第一个值互补的值。然后第一个数依次后移,一直找另外的两值。
解决不允许重复
a+b+c = 0,选择每一个a,b,c时,要选择下一个a,b,c时与当前位置的不同即可。

力扣:18.四数之和

这一题将上两题结合,首先将a,b两个数,变为一个数,然后这个题目就变为了三数之和。

两数可转变为一数,然后将题目一步步的化简。

两类题目的比较
多个数组选择一组满足条件的数:
存储一部分组所有的情况,然后在遍历另一组的值时看是否满足情况。
一个数组选择一组满足条件的数:
首先选定一个数,可以通过二分查找选择两个数。
———————————————————————————
容器作用:
判断元素是否相等
元素个数的比较

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值