Hash Table
文章链接:
programmercarl.com/%E5%93%88%E…
注意点
- 当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。
- 哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。
- 遇到需要判断一个元素是否出现过的场景也应该第一时间想到哈希法!
map
| 映射 | 底层实现 | 是否有序 | 数值是否可以重复 | 能否更改数值 | 查询效率 | 增删效率 |
|---|---|---|---|---|---|---|
| std::map | 红黑树 | key有序 | key不可重复 | key不可修改 | O(logn) | O(logn) |
| std::multimap | 红黑树 | key有序 | key可重复 | key不可修改 | O(log n) | O(log n) |
| std::unordered_map | 哈希表 | key无序 | key不可重复 | key不可修改 | O(1) | O(1) |
set
| 集合 | 底层实现 | 是否有序 | 数值是否可以重复 | 能否更改数值 | 查询效率 | 增删效率 |
|---|---|---|---|---|---|---|
| std::set | 红黑树 | 有序 | 否 | 否 | O(log n) | O(log n) |
| std::multiset | 红黑树 | 有序 | 是 | 否 | O(logn) | O(logn) |
| std::unordered_set | 哈希表 | 无序 | 否 | 否 | O(1) | O(1) |
题目
- 242.有效的字母异位词
- 349.两个数组的交集
- 202.快乐数
- 1.两数之和
242.有效的字母异位词
- 不能用unordered_set
- 一开始比较字符串长度可以快一点
349.两个数组的交集
- 用unordered_map, 使用合适的key和value类型, 可以节省空间
202.快乐数
- 花了点时间看题目
- 两种情况, 变为1或者会陷入循环
1.两数之和
- 一开始用了两个循环来做
- 其实一个循环就够了, 因为不能自身加自身