Leetcode 349. 两个数组的交集

力扣题目跳转链接


代码随想录 题解



题目要求:给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序




解法一: unordered_set


其具体思路和步骤:

  1. 创建一个unordered_set,将数组nums1中的所有元素都加入该unordered_set中。
  2. 创建一个新的unordered_set(即result_set),准备将nums2中和nums1相同的元素放入其中。
  3. 遍历数组nums2,对于nums2中的每个元素,判断该元素是否在nums1的unordered_set中出现。
  4. 如果该元素在nums1的unordered_set中出现,则将该元素加入到新的unordered_set(即result_set)中。
  5. 最后,将新的unordered_set(即result_set)转换为vector,并返回即可。

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) 
    { 
        unordered_set<int> result_set; // 存放结果,之所以用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());
    }
};

注意:直接使用set 不仅占用空间比数组大,而且速度要比数组慢,set把数值映射到key上都要做hash计算的。

该解法时间复杂度为O(m+n),其中m和n分别是两个数组的长度。相比于使用其他数据结构,例如vector和set,使用unordered_set可以达到更高的效率。同时,unordered_set还可以帮助去重,以及判断当前元素是否出现在某个容器中。


在C++的unordered_set中,插入重复元素不会导致数据结构中存在重复。插入已经存在的值会被忽略,unordered_set所维护的数据结构保持不变。

具体而言,当我们要插入一个重复元素时,unordered_set的底层实现将查找表中已经存在该元素的情况,如果该元素被发现,插入操作直接被忽略。

因此,在插入重复元素后,unordered_set所维护的元素个数以及内部数据结构都不会发生任何变化,同时返回值表明插入操作失败,因为元素已经存在。

数组当哈希表的解法

参考代码随想录内容

posted @ 2023-03-26 17:37  专心Coding的程侠  阅读(16)  评论(0编辑  收藏  举报