三种哈希结构:
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类型存储一组同一类型不同形式的字符串。
通过比较容器相等:来判断两个字符串中字符是否对应。
两题比较(字母异位词的两种比较方式):
移动字符串与标准字符串的比较:通过sort函数比较是否相等。
完整的字符串与标准字符串的比较:通过比较容器是否相等。
判断元素是否在数组中即可。
①:比较元素
②:元素个数的比较
第一个数组中第几个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容器)。
查找与此值互补值是否在容器内,不在则添加此值入容器。
添加与判断同步:只会将一对符合条件的值作为结果的行为做一次。
先全部添加再依次判断:会将一对符合条件的值作为结果的行为做两次,造成重复。
容器的选择:
set是一个集合,里面放的元素只能是一个key,无下标。
vector的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。要提前预备空间,很大可能超空间,造成浪费空间。运用map。
两种思路:
①:
四重循环遍历所有,满足则++。
②:
两个二重循环,都是遍历所有,看第二个二重循环的值满足的对应值于第一个二重循环中造成的 vector 结果中是否存在。
比较:一个是四次,一个是两个二次(看第二个中是否存在第一个即可)。
首先选定一个数,然后运用二分查找寻找两边界值之和为第一个值互补的值。然后第一个数依次后移,一直找另外的两值。
解决不允许重复:
a+b+c = 0,选择每一个a,b,c时,要选择下一个a,b,c时与当前位置的不同即可。
这一题将上两题结合,首先将a,b两个数,变为一个数,然后这个题目就变为了三数之和。
两数可转变为一数,然后将题目一步步的化简。
两类题目的比较:
多个数组选择一组满足条件的数:
存储一部分组所有的情况,然后在遍历另一组的值时看是否满足情况。
一个数组选择一组满足条件的数:
首先选定一个数,可以通过二分查找选择两个数。
———————————————————————————
容器作用:
判断元素是否相等
元素个数的比较