两个数组的交集Ⅱ-力扣

  • 想到的解法是使用两个map来进行记录,mp1用来统计num1中每个元素出现的次数。
  • 当nums2的元素能够在mp1中查找到时,将这个元素添加到mp2,按照这个规则统计得到nums2和nums1重复的元素,mp2中的value记录了nums2中这个元素出现的次数
  • 最后我们只需要将两个map同一键值的value取最小值,并添加最小值个数个键值元素到返回数组即可
class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        vector<int> v;
        unordered_map<int, int> mp1;
        unordered_map<int, int> mp2;

        for(int i = 0; i < nums1.size(); i++){
            mp1[nums1[i]]++;
        }

        for(int j = 0; j < nums2.size(); j++){
            if(mp1.find(nums2[j]) != mp1.end()){
                mp2[nums2[j]]++;
            }
        }

        for(auto pair : mp2){
            int num = min(mp2[pair.first], mp1[pair.first]);
            for(int i = 0; i < num; i++){
                v.push_back(pair.first);
            }
        }

        return v;
    }
};

看了官方的题解,在插入到返回数组的处理更加简便,减少了for循环进行对比,在此之前没怎么用过**map.count()**这个函数。

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 num : nums1) {
            ++m[num];
        }
        vector<int> intersection;
        for (int num : nums2) {
            if (m.count(num)) {
                intersection.push_back(num);
                --m[num];
                if (m[num] == 0) {
                    m.erase(num);
                }
            }
        }
        return intersection;
    }
};

作者:力扣官方题解
链接:https://leetcode.cn/problems/intersection-of-two-arrays-ii/solutions/327356/liang-ge-shu-zu-de-jiao-ji-ii-by-leetcode-solution/
来源:力扣(LeetCode)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值