笔记:代码随想录
理论
概念
哈希表(hash table,散列表):是根据关键码的值而直接访问的数据结构,说白,数组就是一张哈希表。要枚举的话时间复杂度是O(n),但如果使用哈希表的话, 只需要O(1)就可以做到。
哈希函数:把变量直接映射为表上的索引。
哈希碰撞:不同变量映射到同一个索引位置。解决方法:拉链法,线性探测法。
哈希结构分类:数组,set集合,map映射(遇到哈希问题可随时切换)
快乐数:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。
作用
快速判断一个元素是否出现在集合里,但也是牺牲空间换取时间,因为也是需要额外的数组,set或map来存放。
使用
1.关于set,C++提供了三种可用的数据结构:std::set(红黑层),std::multiset(红黑层),std::unordered_set(哈希层)map同理。
2.数组简单有效。但空间有限,受到栈空间的限制(不是数据结构的栈)。数组值大小受限,能用是因为题目限制了数值的大小。哈希值分散时,使用数组造成空间浪费。
3.set的空间消耗比数组大,set把数值映射到key是要做hash运算的,且要维护底层。
Leetcode
用数组(省内存,超限的用不了),字典(拥有健值优势),集合(无序)的不同特性。
1.有效的字母异位词
数组
2.两个数组的交集
字典,使用哈希表存储一个数组中的全部元素。
3.快乐数
集合
4.两数之和
字典
5.四数相加
字典
6.赎金信
数组经典场景。
7.三数之和
排序后双指针法的三指针应用
8.四数之和
双指针法