码迷,mamicode.com
首页 > 编程语言 > 详细

两个数组的交集 II---简单

时间:2019-01-23 13:50:54      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:哈希   编写   back   函数   solution   一个   res   intersect   没有   

题目:

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

示例:

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

  输出: [2,2]

思路:

  比较浅显的O(n^2)的做法就是用一个bool数组保存着nums2的元素是否可以被取。暂时没有什么更简便的想法。

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        int length1=nums1.size();
        int length2=nums2.size();
        vector<bool> if_taken{length2};
        vector<int> result;
        for(int i=0;i<length1;i++)
        {
            for(int j=0;j<length2;j++)
            {
                if(nums1[i]==nums2[j])
                {
                    if(!if_taken[j])
                    {
                        result.push_back(nums2[j]);
                        if_taken[j]=true;
                        continue;
                    }
                }
            }
        }
        return result;
    }
};

  结果就是数据量大了,内存不够了呢。

技术分享图片

  让我们来看看更简便的解法吧:

  有一种方法是使用哈希表,先保存第一个数组元素出现的次数,再在nums2中遍历,时间复杂度为O(n)。

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        if (nums1.empty()) 
            return {};
        if (nums2.empty())
            return {};
        vector<int> result;
        map<int,int> nums;
        for (auto i = nums1.cbegin(); i < nums1.cend(); ++i)
        {
            ++nums[*i];
        }
        for (int i = 0; i < nums2.size(); ++i)
        {
            if (nums[nums2[i]])
            {
                result.push_back(nums2[i]);
                --nums[nums2[i]] ;
            }
        }
        return result;
    }
};

  第二种方法先排序,然后使用双指针,看起来复杂度为O(n^2)呢。不过却是最快的,应该还要更详细的数学分析。

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        vector<int> result;
        std::sort(nums1.begin(), nums1.end());
        std::sort(nums2.begin(), nums2.end());
        int index = 0;
        for (int i = 0; i < nums1.size(); ++i) {
            for (int j = index; j < nums2.size(); ++j) {
                if (nums1[i] == nums2[j]) {
                    result.push_back(nums1[i]);
                    index = j + 1;
                    break;
                }
                if (nums1[i] < nums2[j]) {
                    break;
                }
            }
        }
        return result;
    }
};

 

两个数组的交集 II---简单

标签:哈希   编写   back   函数   solution   一个   res   intersect   没有   

原文地址:https://www.cnblogs.com/manch1n/p/10308329.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!