力扣349. 两个数组的交集

题目来源(力扣):

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

题目描述:

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

基本思路:

对数组1构造哈希表m,再扫描一遍数组2,如果数组2中的元素在哈希表m(这里用的是std::unordered_map)中,则加入到答案中
由于答案在逻辑上是集合,而实际上返回的是vector数组,所以元素不可以重复
因此,数组2中的数如果在哈希表m中,则更新对应元素的状态

具体到代码中,在数组1的基础上构造的哈希表m的每个元素的映射值为1,在扫描数组2的过程中,将合法的数加入到答案vector中,并且更新哈希表中元素的映射值为2

如下:

代码实现:

class Solution
{
public:
    vector<int> intersection(vector<int> &nums1, vector<int> &nums2)  //注意这里的返回值是vector<int>
    {
        unordered_map<int, int> m;  //字典(哈希表)
        vector<int> ans;
        for (int i : nums1)  //等价于 for(int k=0;k<nums.size();k++) m[nums[k]]=1; //下同
        {
            m[i] = 1;
        }
        for (int j : nums2)
        {
            if (m[j] == 1)
            {
                m[j] = 2;  防止元素重复
                ans.push_back(j);
            }
        }
        return ans;
    }
};

《代码随想录》写法

代码随想录中使用的是unordered_set,
另外还要学会set转vector、vector转set等的写法

class Solution
{
public:
    vector<int> intersection(vector<int> &nums1, vector<int> &nums2)
    {
        unordered_set<int> m(nums1.begin(), nums1.end()); // 将数组1转化为集合
        unordered_set<int> ans;
        for (int i : nums2)
        {
            if (m.find(i) != m.end()) // 如果数组中的数i也在集合中,则加入到答案ans中
                ans.insert(i);
        }
        return vector<int>(ans.begin(), ans.end()); // 转换为vector类型
    }
};

补充

c++中,set包括std::set std::multiset std::unordered_map

集合 底层实现 是否有序 数值是否可以重复 能否修改数值 查询效率 增删效率
std::set 红黑树 logn logn
std::multiset 红黑树 logn logn
std::unordered_map 哈希表 1 1
posted @ 2024-10-21 19:04  HB_Computer  阅读(9)  评论(0)    收藏  举报