LeetCode 两个数组的交集

给定两个数组,编写一个函数来计算它们的交集。

示例 1:

输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2]

示例 2:

输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [9,4]

说明:

输出结果中的每个元素一定是唯一的。
我们可以不考虑输出结果的顺序。

方法一:使用两个map容器分别标记两个数组中各个元素出现,然后进行核对。(时间复杂度O(n),额外空间复杂度O(n))

class Solution {
public:
    vector intersection(vector& nums1, vector& nums2) {
        vector result;
        unordered_map myMapOne;//用于标记nums1中各元素出现
        unordered_map myMapTwo;//用于标记nums2中各元素出现
        //遍历nums1,标记各个元素出现
        for (auto it = nums1.begin(); it != nums1.end(); ++it){
            myMapOne[*it] = true;
        }
        //遍历nums2,标记各个元素出现
        for (auto it = nums2.begin(); it != nums2.end(); ++it){
            myMapTwo[*it] = true;
        }
        //查交集
        for (auto it = myMapOne.begin(); it != myMapOne.end(); ++it){
            //如果此元素也出现在nums2
            if (myMapTwo[it->first]){
                result.push_back(it->first);
            }
        }
        return result;
    }
};

LeetCode 两个数组的交集_第1张图片
代码优化,其实可以不用两个map容器,一个map容器即可。

class Solution {
public:
    vector intersection(vector& nums1, vector& nums2) {
        vector result;
        unordered_map myMap;//用于标记nums1中各元素出现
        //遍历nums1,标记各个元素出现
        for (auto it = nums1.begin(); it != nums1.end(); ++it){
            myMap[*it] = true;
        }
        //遍历nums2
        for (auto it = nums2.begin(); it != nums2.end(); ++it){
            //如果这个元素之前在nums1中出现过
            if (myMap[*it]){
                result.push_back(*it);//放入交集
                myMap[*it] = false;//因为nums2可能出现重复元素,所以放入交集后需要清除标志,防止重复放入交集
            }
        }
        return result;
    }
};

LeetCode 两个数组的交集_第2张图片
方法二:先将两个数组进行排序,然后从头到尾进行比对查找。(时间复杂度O(n log2n),额外空间复杂度O(n))

class Solution {
public:
    vector intersection(vector& nums1, vector& nums2) {
        vector result;
        sort(nums1.begin(), nums1.end());//将nums1从小到大排序
        sort(nums2.begin(), nums2.end());//将nums2从小到大排序
        int oneIndex = 0, twoIndex = 0;//两个指针分别指向两个数组
        int numsOneSize = nums1.size(), numsTwoSize = nums2.size();
        //查找交集
        while (oneIndex < numsOneSize && twoIndex < numsTwoSize){
            if (nums1[oneIndex] == nums2[twoIndex]){
                result.push_back(nums1[oneIndex]);//放入交集
                //为了避免重复放入交集,这时数组1跳过所有刚刚放入交集内的元素
                while (oneIndex < numsOneSize && nums1[oneIndex] == result.back()){
                    oneIndex += 1;
                }
            }
            else if (nums1[oneIndex] < nums2[twoIndex]){
                oneIndex += 1;
            }
            else{
                twoIndex += 1;
            }
        }
        return result;
    }
};

LeetCode 两个数组的交集_第3张图片

你可能感兴趣的:(LeetCode)