349. Intersection of Two Arrays

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

Example 1:

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

Example 2:

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

Note:

  • Each element in the result must be unique.

  • The result can be in any order.

// Hashset
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { // time: O(m + n); space: O(min(m, n))
    unordered_set<int> st(nums1.begin(), nums1.end()), res;
    for (int num : nums2) {
        if (st.count(num)) res.insert(num);
    }
    return vector<int> (res.begin(), res.end());
}
// STL sorting
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { // time: O(mlogm+nlogn); space: O(min(m, n))
    vector<int> res;
    sort(nums1.begin(), nums1.end());
    sort(nums2.begin(), nums2.end());
    int i = 0, j = 0;
    while (i < nums1.size() && j < nums2.size()) {
        if (nums1[i] < nums2[j]) ++i;
        else if (nums1[i] > nums2[j]) ++j;
        else {
            if (res.empty() || res.back() != nums1[i])
                res.push_back(nums1[i]);
            ++i, ++j;
        }
    }
    return res;
}
// Binary Search
bool 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) return true;
        else if (nums[mid] < target) left = mid + 1;
        else right = mid;
    }
    return false;
}
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { // time: O(nlogn + mlogn); space: O(min(m, n))
    unordered_set<int> res;
    sort(nums2.begin(), nums2.end());
    for (int num : nums1) {
        if (binarySearch(nums2, num))
            res.insert(num);
    }
    return vector<int> (res.begin(), res.end());
}

Last updated

Was this helpful?