Skip to content

Commit 1945872

Browse files
Update
1 parent be23f16 commit 1945872

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

problems/0001.两数之和.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff 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
代码:

problems/0349.两个数组的交集.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff 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
```
1129
class Solution {

0 commit comments

Comments
 (0)