mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-06 23:28:29 +08:00
Update
This commit is contained in:
@ -3,6 +3,16 @@ https://leetcode-cn.com/problems/two-sum/
|
||||
|
||||
## 思路
|
||||
|
||||
很明显暴力的解法是两层for循环查找,时间复杂度是O(n^2)。
|
||||
我们来看一下使用数组和set来做哈希法的局限。
|
||||
|
||||
* 数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。
|
||||
* set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判断y是否存在而且还要记录y的下表位置,因为我们要返回x 和 y的下表。所以set 也不能用。
|
||||
|
||||
此时我们就要选择一种数据结构 map ,map是一种key value的存储结构,我们可以用key保存数值,用value在保存数值所在的下表。
|
||||
这道题目是map在哈希法中的经典应用
|
||||
|
||||
|
||||
## 一般解法
|
||||
|
||||
代码:
|
||||
|
@ -6,6 +6,24 @@ https://leetcode-cn.com/problems/intersection-of-two-arrays/
|
||||
|
||||
这道题目,主要要学会使用一种哈希数据结构,unordered_set,这个数据结构可以解决很多类似的问题
|
||||
|
||||
注意题目特意说明:输出结果中的每个元素一定是唯一的,也就是说输出的结果的去重的, 同时可以不考虑输出结果的顺序
|
||||
|
||||
这道题用暴力的解法时间复杂度是O(n^2),这种解法面试官一定不会满意,那我们看看使用哈希法进一步优化
|
||||
|
||||
那么可以发现,貌似用数组做哈希表可以解决这道题目,把nums1的元素,映射到哈希数组的下表上,然后在遍历nums2的时候,判断是否出现过就可以了。
|
||||
|
||||
但是要注意,使用数据来做哈希的题目,都限制了数值的大小,例如只有小写字母,或者数值大小在[0- 10000] 之内等等。 而这道题目没有限制数值的大小,就无法使用数组来做哈希表了。
|
||||
|
||||
例如说:如果我的输入样例是这样的, 难道要定义一个2亿大小的数组来做哈希表么, 不同的语言对数组定义的大小都是有限制的, 即使有的语言可以定义这么大的数组,那也是对内存空间造成了非常大的浪费。
|
||||
|
||||
此时我们就要使用另一种结构体了,set ,关于set,C++ 给我们提供了如下三种可用的数据结构
|
||||
|
||||
* std::set
|
||||
* std::multiset
|
||||
* std::unordered_set
|
||||
|
||||
std::set和std::multiset底层实现都是红黑树,std::unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,我们并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set
|
||||
|
||||
## 代码
|
||||
```
|
||||
class Solution {
|
||||
|
Reference in New Issue
Block a user