LeetCode_349. Intersection of Two Arrays

349. Intersection of Two Arrays
Given two arrays, write a function to compute their intersection.

Example:
Given nums1 = [1, 2, 2, 1], nums2 = [2, 2], return [2].

Note:
1. Each element in the result must be unique.
2. The result can be in any order.

解题思路:
想到两种思路,一种是先去重,再逐个比较;另一种是用map统计元素。第一种实现思路简单,但是效率上肯定不如第二种,先实现第一种,第二种具体实现还不是太熟悉。

C++:
version_1:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        sort(nums1.begin(), nums1.end());
        sort(nums2.begin(), nums2.end());//unique是对容器相邻元素去重,所以必须先排序
        vector<int>::iterator iter1 = unique(nums1.begin(), nums1.end());
        nums1.erase(iter1, nums1.end());
        vector<int>::iterator iter2 = unique(nums2.begin(), nums2.end());
        nums2.erase(iter2, nums2.end());

        vector<int> sub;
        for (int i=0; ifor (int j=0; jif (nums1[i]==nums2[j])
                {
                    sub.push_back(nums1[i]);
                    break;
                }
            }
        }
        return sub;
    }
};

效率果然不高,耗时46ms。

version_2: map统计

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_map<int, int> map;
        vector<int> result;

        for (int i=0; imap[nums1[i]]++;
        }
        for (int i=0; iif (map[nums2[i]]>0)
            {
                result.push_back(nums2[i]);
                map[nums2[i]] = 0;  //为了避免出现重复元素
            }
        }
        return result;
    }
};

Top Solution:
耗时8ms!比第一种方法快了五六倍!多学习:

version_3:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> m(nums1.begin(), nums1.end());
        vector<int> res;
        for (auto a : nums2)
            if (m.count(a)) {
                res.push_back(a);
                m.erase(a);
            }
        return res;
    }
};

另外,version_4:

vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
    set<int> s(nums1.begin(), nums1.end());
    vector<int> out;
    for (int x : nums2)
        if (s.erase(x))
            out.push_back(x);
    return out;
}

这两种方法暂时不太理解,稍后再仔细看看。

你可能感兴趣的:(基础算法记录)