350. Intersection of Two Arrays II

Map

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];
        int k = 0;
        for (int num : nums2)
        {
            if (m.count(num) && m[num] >= 1)
            {
                --m[num];
                nums1[k++] = num;
            }
        }
        return vector<int>{nums1.begin(), nums1.begin() + k};
    }
};
  • T: O(N+M)O(N + M)
  • S: O(min(n,m))O(min(n, m))

Sort

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2)
    {
        sort(nums1.begin(), nums1.end());
        sort(nums2.begin(), nums2.end());

        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>{nums1.begin(), nums1.begin() + k};
    }
};
  • T: O(NlogN+MlogM)O(N \log N + M \log M)
  • S: O(logN+logM)O(\log N + \log M)