1. 程式人生 > >[LeetCode] Intersection of Two Arrays II 兩個陣列相交之二

[LeetCode] 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?
這道題是之前那道Intersection of Two Arrays的拓展,不同之處在於這道題允許我們返回重複的數字,而且是儘可能多的返回,之前那道題是說有重複的數字只返回一個就行。那麼這道題我們用雜湊表來建立nums1中字元和其出現個數之間的對映, 然後遍歷nums2陣列,如果當前字元在雜湊表中的個數大於0,則將此字元加入結果res中,然後雜湊表的對應值自減1,參見程式碼如下:

解法一:

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int
>& nums2) { unordered_map<int, int> m; vector<int> res; for (auto a : nums1) ++m[a]; for (auto a : nums2) { if (m[a]-- > 0) res.push_back(a); } return res; } };

再來看一種方法,這種方法先給兩個陣列排序,然後用兩個指標分別指向兩個陣列的起始位置,如果兩個指標指的數字相等,則存入結果中,兩個指標均自增1,如果第一個指標指的數字大,則第二個指標自增1,反之亦然,參見程式碼如下:

解法二:

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        vector<int> res;
        int i = 0, j = 0;
        sort(nums1.begin(), nums1.end());
        sort(nums2.begin(), nums2.end());
        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;
    }
};

類似題目:

參考資料: