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 if (nums1[i] > nums2[j])
                j++;
            else if (nums1[i] < nums2[j])
                i++;
            else {
                intersection.push_back(nums1[i]);
                i++;
                j++;
            }
        }

        return intersection;
    }
};

总结

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

你可能感兴趣的:(编程解题)