哈希表理论基础
建议:大家要了解哈希表的内部实现原理,哈希函数,哈希碰撞,以及常见哈希表的区别,数组,set 和map。
什么时候想到用哈希法,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。 这句话很重要,大家在做哈希表题目都要思考这句话。 文章讲解。
在D4已经遇到了set/map的结构对比了,这里再补充一下对比。(from carlprogrming)
242.有效的字母异位词
建议: 这道题目,大家可以感受到 数组 用来做哈希表 给我们带来的遍历之处。 题目链接/文章讲解/视频讲解。
第一反应是用python的字典结构来记录character出现的个数,再比较两个字典是否相同。如果是一个字典呢?第二个字典在原字典基础上计数递减,那么省了一半的空间,如果不用字母作为Key,而是数值(当前字母和字母a的差值),那么可以直接用数组结构(array), 因为数组也是由Index和value的对应关系来表示的, 和字典的key, value结构类似底层都是hash table。能用数组的时候尽量用数组,比另外两种结构set/map要快。
Python方法一:字典
Python方法二:数组
数组方法需要把index确定为int格式, python里用ord()函数实现,Python ord() 函数是一个内置函数,可以将一个字符转换为对应的 ASCII 或 Unicode 数值,或者将一个 ASCII 或 Unicode 数值转换为对应的字符。这里补充一些Python的编码的知识:非常详细的字符编码讲解,ASCII、GB2312、GBK、Unicode、UTF-8等知识点都有
C++方法二:数组
仅实现数组方法,声明一个指定长度元素全为0的数组的方法: record[26] = {0}。
349. 两个数组的交集
建议:本题就开始考虑 什么时候用set 什么时候用数组,本题其实是使用set的好题,但是后来力扣改了题目描述和 测试用例,添加了 0 <= nums1[i], nums2[i] <= 1000 条件,所以使用数组也可以了,不过建议大家忽略这个条件。 尝试去使用set。 题目链接/文章讲解/视频讲解。
求集合的交集, 再转换成数组输出即可。
Python 方法一: set
Python 方法二:数组
leetcode后续把array中元素的范围限制在了[0, 1000], 所以这个题可以用数组实现。如果数字范围是可变的,那么就不是和数组,需要的空间也是无限大。
C++ 方法一: set - unordered_set
把vector内的元素全部放到unordered_set 参考line27。
C++ 方法二:数组
202. 快乐数
建议:这道题目也是set的应用,其实和上一题差不多,就是 套在快乐数一个壳子。题目链接/文章讲解。
Python 方法:
求digits平方参考C++方法,str的转换也是需要消耗时间的。
C++ 方法:
1. 两数之和
建议:本题虽然是 力扣第一题,但是还是挺难的,也是 代码随想录中 数组,set之后,使用map解决哈希问题的第一题。
建议大家先看视频讲解,然后尝试自己写代码,在看文章讲解,加深印象。题目链接/文章讲解/视频讲解。
Python 方法:
C++ 方法:
注意C++中函数return {}; 不能省略。 返回list 直接写 {ele1, ele2, ...} 即可; 找到unordered_map对应key的value, 使用it-> second:
it表示按key找到的整个item。
it->first 表示的是这个元素的key的值;
it->second 表示的是这个元素的value的值。