4. 哈希表
1. 使用哈希法一般选择三种数据结构:数组、Set、Map;
优先使用 unordered_set(查询和增删的效率最优),如果需要集合有序则使用 set,如果要求不仅有序还有重复数据则使用 multiset;
set、multiset 底层符号表使用红黑树来存储数据,但是依然是使用哈希函数来做映射;Map同理;
| 集合 | 底层实现 | 是否 有序 |
数值是否 可以重复 |
能否更改 数值 |
查询效率 | 增删效率 |
| set | 红黑树 | 有序 | 否 | 否 | O(log n) | O(log n) |
| multiset | 红黑树 | 有序 | 是 | 否 | O(log n) | O(log n) |
| unordered_set | 哈希表 | 无序 | 否 | 否 | O(1) | O(1) |
| map | 红黑树 | Key有序 | Key不可重复 | Key不可重复 | O(log n) | O(log n) |
| multimap | 红黑树 | Key有序 | Key可重复 | Key可重复 | O(log n) | O(log n) |
| unordered_map | 哈希表 | Key无序 | Key不可重复 | Key不可重复 | O(1) | O(1) |
2. 一般哈希法用于解决快速判断一个元素是否出现在集合里;
3. 有效的字母异位词(力扣242):和字母有关的,或者是有一个固定小的范围的,可以使用数组;
4. 两个数组的交集(力扣349):使用 set 不仅占用空间比数组大,而且速度要比数组慢,set把数值映射到key上都要做hash计算的;
5. 快乐数(力扣202):略;
6. 两数之和(力扣1):由于查找目标值和的两数,还需要返回所在数组的下标,存在key-value之间的关系,所以考虑使用map;
7. 四数相加(力扣454):可以拆成两部分进行比较,再对比较后的两部分进行叠加;
8. 赎金信(力扣383):遇到字母的,首先可以考虑数组,使用map的空间消耗比数组大,还要维护红黑树或者哈希表,比较费时;

9. 三数之和(力扣15):双指针法,对于边界的判断尤为复杂;
10. 四数之和(力扣18):同上;

浙公网安备 33010602011771号