LeetCode第350题---两个数组的交集 II

LeetCode链接: link.

在这里插入图片描述
解题思路:

  1. 先用unordered_map统计nums1中每个元素出现的次数
  2. 遍历nums2,如果发现nums2中的e出现于unordered_map中,就将其存入v中,然后让m[e]自减,当记录e在字典中的值为0时,就将这条记录删除。
class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        //对nums1数组进行次数的统计
        unordered_map<int,int> m;
        for(auto& e : nums1)
        {
            m[e]++;
        }

        vector<int> v;
        for(auto& e : nums2)
        {
            if(m.count(e)) //说明两个数组都有这个值
            {
                v.push_back(e);
                m[e]--;
                if(um[e] == 0)
                {
                    m.erase(e);
                }
            }
        }
        return v;
    }
};

在这里插入图片描述
双指针法
我感觉这种解题思路更加能够想清楚。

  • 定义两个指针分别指向数组的开始,比较大小,谁小指针就往后走,当一样大的时候,说明此时这个数就是要找的交集,添加到vector中,并且指针同时往后走,当其中一个数组先遍历完,那么也就结束了。
class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        sort(nums1.begin(),nums1.end());
        sort(nums2.begin(),nums2.end());

        vector<int> v;
        size_t begin1 = 0,end1 =nums1.size();
        size_t begin2 = 0,end2 = nums2.size();
        while((begin1 < end1) && (begin2 < end2))
        {
            if(nums1[begin1] < nums2[begin2])
            {
                begin1++;
            }
            else if(nums1[begin1] > nums2[begin2])
            {
                begin2++;
            }
            else
            {
                v.push_back(nums1[begin1]);
                begin1++;
                begin2++;
            }
        } 
        return v;
    }
};

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值