LeetCode 350. Intersection of Two Array II 解题报告

LeetCode 350. Intersection of Two Array II 解题报告

题目描述

Given two arrays, write a function to compute their intersection.

  • Each element in the result should appear as many times as it shows in both arrays.
  • The result can be in any order.

示例

Given nums1 = [1, 2, 2, 1], nums2 = [2, 2], return [2, 2].


限制条件

没有明确给出。


解题思路

我的思路:

这道题的原始版本之前已经做过了,见LeetCode 349. Intersection of Two Array。所以我按照之前的两种思路:用关联容器跟用排序加双指针去做这道题

1.用关联容器:
与之前做的不一样的是,这道题允许元素重复出现在结果中,因此改动主要有两个地方,一是关联容器换成是unordered_multiset以便能够保持重复元素,二是通过迭代器去删除已发现的元素避免把具有相同值的元素都删掉。程序的其他细节与之前的类似,可以参考之前的博文。

2.用排序加双指针
唯一要改的地方就是去掉了加入元素时判断不重复的语句,因为题目允许元素重复,所以直接添加即可,其他代码不变。


代码

我的代码1

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        vector<int> intersection;
        unordered_multiset<int> number(nums1.begin(), nums1.end());
        unordered_multiset<int>::iterator itr = number.end();

        for (auto n: nums2) {
            itr = number.find(n);
            if (itr != number.end()) {
                intersection.push_back(n);
                number.erase(itr);
            }
        }

        return intersection;
    }
};

我的代码2

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        vector<int> intersection;

        sort(nums1.begin(), nums1.end());
        sort(nums2.begin(), nums2.end());

        for (int i = 0, j = 0; i < nums1.size() && j <nums2.size(); ) {
            if (nums1[i] > nums2[j])
                j++;
            else if (nums1[i] < nums2[j])
                i++;
            else {
                intersection.push_back(nums1[i]);
                i++;
                j++;
            }
        }

        return intersection;
    }
};

总结

由于做过这道题的第一版,所以这二版挺简单的,根据题意改一下代码即可通过。
今天第一个坑,接下来是第二个坑,加油!↖(^ω^)↗

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值