File tree Expand file tree Collapse file tree 2 files changed +28
-0
lines changed
Expand file tree Collapse file tree 2 files changed +28
-0
lines changed Original file line number Diff line number Diff line change @@ -3,6 +3,16 @@ https://leetcode-cn.com/problems/two-sum/
33
44## 思路
55
6+ 很明显暴力的解法是两层for循环查找,时间复杂度是O(n^2)。
7+ 我们来看一下使用数组和set来做哈希法的局限。
8+
9+ * 数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。
10+ * set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判断y是否存在而且还要记录y的下表位置,因为我们要返回x 和 y的下表。所以set 也不能用。
11+
12+ 此时我们就要选择一种数据结构 map ,map是一种key value的存储结构,我们可以用key保存数值,用value在保存数值所在的下表。
13+ 这道题目是map在哈希法中的经典应用
14+
15+
616## 一般解法
717
818代码:
Original file line number Diff line number Diff line change @@ -6,6 +6,24 @@ https://leetcode-cn.com/problems/intersection-of-two-arrays/
66
77这道题目,主要要学会使用一种哈希数据结构,unordered_set,这个数据结构可以解决很多类似的问题
88
9+ 注意题目特意说明:输出结果中的每个元素一定是唯一的,也就是说输出的结果的去重的, 同时可以不考虑输出结果的顺序
10+
11+ 这道题用暴力的解法时间复杂度是O(n^2),这种解法面试官一定不会满意,那我们看看使用哈希法进一步优化
12+
13+ 那么可以发现,貌似用数组做哈希表可以解决这道题目,把nums1的元素,映射到哈希数组的下表上,然后在遍历nums2的时候,判断是否出现过就可以了。
14+
15+ 但是要注意,使用数据来做哈希的题目,都限制了数值的大小,例如只有小写字母,或者数值大小在[ 0- 10000] 之内等等。 而这道题目没有限制数值的大小,就无法使用数组来做哈希表了。
16+
17+ 例如说:如果我的输入样例是这样的, 难道要定义一个2亿大小的数组来做哈希表么, 不同的语言对数组定义的大小都是有限制的, 即使有的语言可以定义这么大的数组,那也是对内存空间造成了非常大的浪费。
18+
19+ 此时我们就要使用另一种结构体了,set ,关于set,C++ 给我们提供了如下三种可用的数据结构
20+
21+ * std::set
22+ * std::multiset
23+ * std::unordered_set
24+
25+ std::set和std::multiset底层实现都是红黑树,std::unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,我们并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set
26+
927## 代码
1028```
1129class Solution {
You can’t perform that action at this time.
0 commit comments