LeetCode350. 两个数组的交集 II

350. 两个数组的交集 II

class Solution {
public:
    //时间O(n + m), 空间O(n + m)    (可以对较小的vector进行哈希映射,进一步优化空间为O(min(n, m)))
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        int len1 = nums1.size();
        int len2 = nums2.size();
        if(len1 == 0 || len2 == 0) return vector<int>();
        vector<int> res;
        unordered_map<int, int> mp1;
        unordered_map<int, int> mp2;
        for(auto& val : nums1) {
            mp1[val]++;
        }
        for(auto& val : nums2) {
            mp2[val]++;
        }
        for(auto& val: mp1) {
            int num = min(val.second, mp2[val.first]);
            if(num) {
                res.insert(res.end(), num, val.first);
            }
        }
        return res;
    }
};
class Solution {
public:
    //时间O(nlonn + mlogm), 空间O(1)(n,m为vector的大小)
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        sort(begin(nums1), end(nums1));
        sort(begin(nums2), end(nums2));
        int i = 0, j = 0, k = 0;
        while (i < nums1.size() && j < nums2.size()) {
            if (nums1[i] < nums2[j]) {
                ++i;
            } else if (nums1[i] > nums2[j]) {
                ++j;
            } else {
                nums1[k++] = nums1[i++];
                ++j;
            }
        }
        return vector<int>(begin(nums1), begin(nums1) + k);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值