LeetCode-349

两个数组的交集

题目
给定两个数组,编写一个函数来计算它们的交集。
说明:
输出结果中的每个元素一定是唯一的。
我们可以不考虑输出结果的顺序。

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

题解

方法 1 两个集合

计算数组的交集,可以通过遍历一个数组,判断其中的每一个元素是否出现在另一个数组中,而判断的时间复杂度为 O(n) 较高,可以通过将数组转换为哈希集合的方法降低其时间复杂度为 O(1) 。
因此,使用两个哈希集合分别存储两个数组中的元素,遍历较小的集合,判断其是否出现在另一个集合中,若出现,则将其添加到返回值。

方法 2 排序+双指针

求得两数组元素的交集,可以采用先排序,再利用双指针的方法求解。
定义两指针,若指向元素相等,且不等于上一个加入答案的元素(避免重复元素),则将其加入答案;若指向元素不相等,则将指向较小元素的指针右移。任一数组遍历完成时求解结束。

更多题解

代码

方法 1 两个集合

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        //unordered_set 去除重复元素
        unordered_set<int> set1,set2;
        for(auto& num:nums1){
            set1.insert(num);
        }
        for(auto& num:nums2){
            set2.insert(num);
        }
        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.count(num)){
                intersection.push_back(num);
            }
        }
        return intersection;
    }
};

方法 2 排序+双指针

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        //对数组元素进行排序
        //重复元素必然连续
        sort(nums1.begin(),nums1.end());
        sort(nums2.begin(),nums2.end());
        int length1=nums1.size(),length2=nums2.size();
        int index1=0,index2=0;
        vector<int> intersection;
        //双指针遍历
        while(index1<length1&&index2<length2){
            if(nums1[index1]==nums2[index2]){
                
                //注意判断条件顺序
                //避免重复元素
                //back() 返回当前vector容器中末尾元素的引用
                if(!intersection.size()||nums1[index1]!=intersection.back()){
                    intersection.push_back(nums1[index1]);
                }
                index1++;
                index2++;
            }
            else if(nums1[index1]<nums2[index2]){
                index1++;
            }
            else{
                index2++;
            }
        }
        return intersection;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值