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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode真题349:给定两个数组,编写一个函数来计算它们的交集。相关的知识,希望对你有一定的参考价值。

参考技术A 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2],

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

var intersection = function(nums1, nums2) 

    var hash1 = new Set(nums1);//定义哈希数组

    var hash2 = new Set();

    for(var i=0;i<nums2.length;i++)

        if(hash1.has(nums2[i]))

            hash2.add(nums2[i])

        

           

    return  [...hash2];//返回数组

;  

简洁明了,时间复杂度O(m+n)

哈希表查询某个元素只需要O(1)的操作,英雌遍历了两个数组的时间复杂度为O(m+n),因此常与二分法并列为查询一个数的最佳方法

《LeetCode之每日一题》:51.两个数组的交集 II

两个数组的交集 II


题目链接: 两个数组的交集 II

有关题目

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

输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。

我们可以不考虑输出结果的顺序。
进阶:

如果给定的数组已经排好序呢?你将如何优化你的算法?--对应法二
如果 nums1 的大小比 nums2 小很多,哪种方法更优?--对应法一
如果 nums2 的元素存储在磁盘上,内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?--对应法一

题解

法一:哈希表
参考官方题解

为了降低空间复杂度,首先遍历较短的数组并在哈希表中记录每个数字以及对应出
现的次数,然后遍历较长的数组得到交集。
class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        if (nums1.size() > nums2.size())
            return intersect(nums2,nums1);//降低复杂度我们人为控制调用函数中的第一个数组的大小小于第二个
        unordered_map<int,int> m;
        for (int num1 : nums1)
            ++m[num1];//录入键值对
        vector<int> intersection;
        for (int num2 : nums2)
        {
            if (m.find(num2) != m.end())
                {
                    intersection.push_back(num2);
                    --m[num2];
                }
            if (m[num2] == 0)//num2出现的次数使用完,移除该元素
                m.erase(num2);
        }
        return intersection;
    }
};

在这里插入图片描述

法二:排序 + 双指针

思路:
两个下标idx1,idx2分别遍历排好序的数组
超过数组的长度结束遍历
class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        int len1 = nums1.size();
        int len2 = nums2.size();
        sort(nums1.begin(),nums1.end());
        sort(nums2.begin(),nums2.end());//排序
        vector<int> intersection;
        int idx1 = 0,idx2 = 0;
        while(idx1 < len1 && idx2 < len2)
        {
            if (nums1[idx1] > nums2[idx2])
                idx2++;
            else if (nums1[idx1] < nums2[idx2])
                idx1++;
            else
                {
                    intersection.push_back(nums1[idx1]);
                    idx1++;
                    idx2++;
                }
        }
        return intersection;
    }
};

在这里插入图片描述
在这里插入图片描述

以上是关于LeetCode真题349:给定两个数组,编写一个函数来计算它们的交集。的主要内容,如果未能解决你的问题,请参考以下文章

leetcode349. 两个数组的交集

LeetCode 349. 两个数组的交集

Leetcode刷题100天—349. 两个数组的交集(集合)—day08

leetcode NO.349 两个数组的交集 (python实现)

LeetCode Java刷题笔记—349. 两个数组的交集

LeetCode Java刷题笔记—349. 两个数组的交集