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

Posted 是七喜呀!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode之每日一题》:47.两个数组的交集相关的知识,希望对你有一定的参考价值。

两个数组的交集


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

有关题目

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

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

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

输出结果中的每个元素一定是唯一的。
我们可以不考虑输出结果的顺序。

题解

法一:两个集合–哈希表

思路:使用哈希表来降低时间复杂度

在这里插入图片描述
代码一:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> set1,set2;
        for (auto& num1 : nums1)
        {
            set1.insert(num1);
        }
        for (auto& num2 : nums2)
        {
            set2.insert(num2);
        }
        
        return getIntersection(set1,set2);
    }
vector<int> getIntersection(unordered_set<int>& set1, unordered_set<int>& set2)
{
    if(set1.size() > set2.size())
        return getIntersection(set2,set1);
    vector<int> intersection;
    for (auto& num : set1)
    {
        if (set2.find(num) != set2.end())//set.count(num)也可以
            intersection.push_back(num);
    }
    return intersection;
}
};

时间复杂度:O(m + n)
空间复杂度:O(m + n)
在这里插入图片描述
代码二:

		//对上面的set2进行优化
        //if (set1.find(num2))
        //set2.insert(nums2)
        class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> set1,set2;
        for (auto& num : nums1)
        {
            set1.insert(num);
        }
        for (auto& num : nums2)
        {
        //优化代码一
            if (set1.find(num) != set1.end())//find
                set2.insert(num);
        }
        vector<int> intersection;//同时注意这边要用容器来装set2中的值,直接返回set就出错了
        for (auto& num : set2)
            intersection.push_back(num);
            return intersection;
    }
};

在这里插入图片描述

代码三:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        vector<int> ans;
        unordered_set<int> mp{nums1.begin(),nums1.end()};
        for(auto& num2 : nums2)
        {
            if (mp.find(num2) != mp.end())
                {
                    mp.erase(num2);
                    ans.emplace_back(num2);
                }
        }
        return ans;
    }
};

时间复杂度:O(m + n)
空间复杂度:O(m + n)
在这里插入图片描述
法二:二分查找

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> set;
        sort(nums2.begin(), nums2.end());
        for (auto& target : nums1)
        {
            if (binarySearch(nums2,target) && !set.count(target))
            {
                set.insert(target);
            }
        }
         vector<int> intersection;
        for (auto& num : set)
            intersection.push_back(num);
        return intersection;
    }
    
bool binarySearch(vector<int>& nums2,int target)
{
    int l = 0, r = nums2.size() - 1;
    while(l <= r)
    {
        int mid = l + (r - l) / 2;
        if (nums2[mid] == target)
            return true;
        else if (nums2[mid] < target)
            l = mid + 1;
        else 
            r = mid - 1;
    }
    return false;
}
};

时间复杂度:nlog n。nums2的排序nlogn,加上nums1的遍历 m,加上二分查找的log m,共计nlog n。
空间复杂度:O(Max{m,n})
在这里插入图片描述

法三:排序 + 双指针

思路:先排序,再使用双指针

在这里插入图片描述

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        sort(nums1.begin(),nums1.end());
        sort(nums2.begin(),nums2.end());
        int len1 = nums1.size(),len2 = nums2.size();
        int idx1 = 0,idx2 = 0;
        vector<int> intersection;
        while(idx1 < len1 && idx2 < len2)
        {
            int num1 = nums1[idx1],num2 = nums2[idx2];
            if (num1 == num2)
                {
                    if (!intersection.size() || num1 != intersection.back())//back就是用来保证元素的唯一性的
                    //而前一个条件是用来防止当intersection中无元素,造成非法访问
                        intersection.push_back(num1);
                        //别忘了两个指针同时往后面移动
                        idx1++;
                        idx2++;
                }
            else if (num1 < num2)
                idx1++;
            else 
                idx2++;
        }
        return intersection;
    }
};

在这里插入图片描述

在这里插入图片描述

以上是关于《LeetCode之每日一题》:47.两个数组的交集的主要内容,如果未能解决你的问题,请参考以下文章

《LeetCode之每日一题》:274.合并两个有序数组

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

《LeetCode之每日一题》:18.合并两个有序数组

《LeetCode之每日一题》:249.两数之和 II - 输入有序数组

《LeetCode之每日一题》:249.两数之和 II - 输入有序数组

《LeetCode之每日一题》:253.将一维数组转变成二维数组