350. Intersection of Two Arrays II

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

Example 1:

Input: nums1 = [1,2,2,1], nums2 = [2,2]
Output: [2,2]

Example 2:

Input: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
Output: [4,9]

Note:

  • Each element in the result should appear as many times as it shows in both arrays.

  • The result can be in any order.

Follow up:

  • What if the given array is already sorted? How would you optimize your algorithm?

  • What if nums1's size is small compared to nums2's size? Which algorithm is better?

  • What if elements of nums2 are stored on disk, and the memory is limited such that you cannot load all elements into the memory at once?

// Hashmap
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) { // time: O(m + n); space: O(m)
    vector<int> res;
    unordered_map<int, int> mp;
    for (int num : nums2) ++mp[num];
    for (int num : nums1) {
        if (mp[num]-- > 0) res.push_back(num);
    }
    return res;
}
// STL Sorting + Two Pointers
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) { // time: O(mlogm + nlogn); space: O(min(m, n))
    sort(nums1.begin(), nums1.end());
    sort(nums2.begin(), nums2.end());
    int i = 0, j = 0;
    vector<int> res;
    while (i < nums1.size() && j < nums2.size()) {
        if (nums1[i] == nums2[j]) {
            res.push_back(nums1[i]);
            ++i, ++j;
        } else if (nums1[i] > nums2[j]) {
            ++j;
        } else {
            ++i;
        }
    }
    return res;
}
// Binary Search (Lower bound)
int binarySearch(vector<int>& nums, int target) {
    int left = 0, right = nums.size();
    while (left < right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] < target) left = mid + 1;
        else right = mid;
    }
    return left;
}
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) { // time: O(mlogm + nlogn + mlogn); space: O(min(m, n))
    sort(nums1.begin(), nums1.end());
    sort(nums2.begin(), nums2.end());
    int i = 0, j = 0;
    vector<int> res;
    while (i < nums1.size()) {
        int index = binarySearch(nums2, nums1[i]);
        // int index = lower_bound(nums2.begin(), nums2.end(), nums1[i]) - nums2.begin();
        int cnt2 = 0;
        while (index < nums2.size() && nums2[index] == nums1[i]) {
            ++cnt2;
            ++index;
        }
        int cnt1 = 0;
        while (j < nums1.size() && nums1[i] == nums1[j]) {
            ++cnt1;
            ++j;
        }
        res.insert(res.end(), min(cnt1, cnt2), nums1[i]);
        i = j;
    }
    return res;
}

Last updated

Was this helpful?