349. 两个数组的交集

1.题目描述

给定两个数组,编写一个函数来计算它们的交集。
示例 1:
在这里插入图片描述
示例 2:
在这里插入图片描述
说明:
1.输出结果中的每个元素一定是唯一的。
2.我们可以不考虑输出结果的顺序。

2.方法1

分别遍历两个数组并用set保存每个数组的元素,元素较少的set记为s1,元素较多的set记为s2,遍历s1并查找当前遍历的元素是否存在于s2中,如果存在就加入结果数组。

3.代码

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> s1, s2;
        for(auto &num : nums1){
            s1.insert(num);
        }
        for(auto &num : nums2){
            s2.insert(num);
        }
        return getIntersection(s1, s2);

    }
    vector<int> getIntersection(unordered_set<int>& s1, unordered_set<int>& s2){
        if(s1.size() > s2.size()){
            return getIntersection(s2, s1);
        }
        vector<int> res;
        for(auto &num : s1){
            if(s2.count(num)){
                res.push_back(num);
            }
        }
        return res;
    }
};

4.复杂度分析

时间复杂度:O(m + n),m,n分别为两个数组的长度
空间复杂度:O(m + n)

5.方法2(排序+双指针)

分别对两个数组排序,设置两个指针index1,index2分别指向两个数组的开头,如果两个指针的元素相等,则加入结果数组(但是要去重,由于数组是有序的,只需要和结果数组的最后一个元素比较即可)且index1++,index2++,如果num1[index1] < nums2[index2],则index1++,否则index2++。

6.代码

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        sort(nums1.begin(), nums1.end());
        sort(nums2.begin(), nums2.end());

        int index1 = 0, index2 = 0;
        vector<int> res;
        while(index1 < nums1.size() && index2 < nums2.size()){
            if(nums1[index1] == nums2[index2]){
                if(res.empty() || nums1[index1] != res.back()){
                    res.push_back(nums1[index1]);
                }
                index1++;
                index2++;
            }
            else if(nums1[index1] < nums2[index2]){
                index1++;
            }
            else{
                index2++;
            }
        }
        return res;
    }
};

7.复杂度分析

时间复杂度:O(mlogm + nlogn)
空间复杂度:O(mlogm + nlogn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值