Files
leetcode-master/problems/0349.两个数组的交集.md
youngyangyang04 9dcd5e3d2e Update
2020-07-22 09:19:22 +08:00

2.4 KiB
Raw Blame History

题目地址

https://leetcode-cn.com/problems/intersection-of-two-arrays/

思路

这道题目主要要学会使用一种哈希数据结构unordered_set这个数据结构可以解决很多类似的问题

注意题目特意说明:输出结果中的每个元素一定是唯一的,也就是说输出的结果的去重的, 同时可以不考虑输出结果的顺序

这道题用暴力的解法时间复杂度是O(n^2),这种解法面试官一定不会满意,那我们看看使用哈希法进一步优化

那么可以发现貌似用数组做哈希表可以解决这道题目把nums1的元素映射到哈希数组的下表上然后在遍历nums2的时候判断是否出现过就可以了。

但是要注意,使用数据来做哈希的题目,都限制了数值的大小,例如只有小写字母,或者数值大小在[0- 10000] 之内等等。 而这道题目没有限制数值的大小,就无法使用数组来做哈希表了。

例如说:如果我的输入样例是这样的, 难道要定义一个2亿大小的数组来做哈希表么 不同的语言对数组定义的大小都是有限制的, 即使有的语言可以定义这么大的数组,那也是对内存空间造成了非常大的浪费。

此时我们就要使用另一种结构体了set 关于setC++ 给我们提供了如下三种可用的数据结构

  • std::set
  • std::multiset
  • std::unordered_set

std::set和std::multiset底层实现都是红黑树std::unordered_set的底层实现是哈希表 使用unordered_set 读写效率是最高的我们并不需要对数据进行排序而且还不要让数据重复所以选择unordered_set

代码

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> result_set; // 存放结果
        unordered_set<int> nums_set(nums1.begin(), nums1.end());
        for (int num : nums2) {
            // 发现nums2的元素 在nums_set里又出现过
            if (nums_set.find(num) != nums_set.end()) {
                result_set.insert(num);
            }
        }
        return vector<int>(result_set.begin(), result_set.end());
    }
};

更过算法干货文章持续更新可以微信搜索「代码随想录」第一时间围观关注后回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等就可以获得我多年整理的学习资料。