[LeetCode] Intersection of Two Array | 两个数组找交集

https://leetcode.com/problems/intersection-of-two-arrays/?tab=Description

一开始没弄清题意,以为是像intersection of two linked lists那样找交点,但实际上不是。其实是找两个数组的交集,即把两个数组中都有的元素不重不漏地找出来,所以其实比linked list的交点要简单。

思路1:Hash Set

首先把一个数组的所有元素放到一个Hash Set中,然后扫描另一个数组,在Hash Set中查找是否存在,同时再建立一个Hash Set,把已经找到的属于交集的元素放进去(目的是避免元素被重复加入结果数组)。

Time complexity: O(n + m)
Space complexity: O(n + m) 其中n, m分别表示两个数组的元素个数

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> s, tmp;
        vector<int> ret;
        
        for (int i : nums1) {
            s.insert(i);
        }
        
        for (int j : nums2) {
            if (s.find(j) != s.end() && tmp.find(j) == tmp.end()) {
                ret.push_back(j);
                tmp.insert(j);
            }
        }
        
        return ret;
    }
};

下面两种思路,是参考网上的其他解答。

思路2:merge two sorted arrays

先将两个数组排好序,然后模拟合并排序数组的操作(但不用真开一个辅助数组),合并过程中遇到相等的就放入结果数组,注意要判断是否unique。由于结果数组是有序的,所以只要与最后一个比较(如果有的话)看是否相等即可。

Time complexity: O(nlogn + mlogm)
Space complexity: O(1)

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        sort(nums1.begin(), nums1.end());
        sort(nums2.begin(), nums2.end());
        
        // merge two sorted arrays
        vector<int> ret;
        int i = 0, j = 0;
        while (i < nums1.size() && j < nums2.size()) {
            if (nums1[i] == nums2[j]) {
                if (ret.size() == 0 || 
                    (ret.size() > 0 && nums1[i] != ret[ret.size()-1])) {
                    ret.push_back(nums1[i]);
                }
                i++; j++;
            } else if (nums1[i] < nums2[j]) {
                i++;
            } else {
                j++;
            }
        }
        
        return ret;
    }
};

先将其中一个数组排序,然后遍历另一个数组,并对排序数组进行二分查找以确定交集。

Time complexity: O(nlogn + mlogn)
Space complexity: O(m)

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        if (nums1.empty() || nums2.empty()) {
            return vector<int>();
        }
        
        sort(nums1.begin(), nums1.end());
        
        unordered_set<int> s;
        for (int i = 0; i < nums2.size(); ++i) {
            vector<int>::iterator it = lower_bound(nums1.begin(), nums1.end(), nums2[i]);
            if (*it == nums2[i]) {
                s.insert(nums2[i]);
            }
        }
        
        vector<int> ret(s.size());
        int k = 0;
        for (int ele : s) {
            ret[k++] = ele;
        }
        
        return ret;
    }
};
原文地址:https://www.cnblogs.com/ilovezyg/p/6411466.html