【力扣-哈希表】2、两个数组的交集(349)

359 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

349. 两个数组的交集

题目描述

给定两个数组,编写一个函数来计算它们的交集。

示例 1:

输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2]

示例 2:

输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [9,4]

暴力法

使用集合的查找算法,判断nums1中的元素在nums2中是否存在。 常用查找算法【c++常用查找算法】

class Solution
{
public:
    vector<int> intersection(vector<int> &nums1, vector<int> &nums2)
    {
        // 返回结果数组
        vector<int> ret;

        for (int i = 0; i < nums1.size(); i++)
        {
            // 在nums2中查找nums1中的元素
            vector<int>::iterator it = find(nums2.begin(), nums2.end(), nums1[i]);
            // 如果找到
            if (it != nums2.end())
            {
                // 再判断结果数组中是否已经存在
                vector<int>::iterator it2 = find(ret.begin(), ret.end(), nums1[i]);
                // 不存在,将数字添加到结果数组中
                if (it2 == ret.end())
                {
                    ret.push_back(nums1[i]);
                }
            }
        }
        return ret;
    }
};

哈希法

  • 1、题述中说明了不考虑元素的顺序,而且去重了。
  • 2、题目限制了数值的大小时可以使用数组来解哈希类的题目
  • 3、考虑到上面两个问题,我们可以使用set集合
  • 4、set集合分为 set multi_set unordered_set
  • 5、本题选择使用 unordered_set
class Solution
{
public:
    // 哈希法
    vector<int> intersection(vector<int> &nums1, vector<int> &nums2)
    {
        // 返回结果数组
        vector<int> ret;
        //对nums1和nums2进行去重处理
        unordered_set<int> nums1_set(nums1.begin(), nums1.end());
        unordered_set<int> nums2_set(nums2.begin(), nums2.end());
        // 遍历去重后的数组nums1_set,在nums2_set中查找
        for (int num : nums1_set)
        {
            unordered_set<int>::iterator it = nums2_set.find(num);
            if (it != nums2_set.end())
            {
                ret.push_back(num);
            }
        }

        return ret;
    }
};

image.png