zoukankan      html  css  js  c++  java
  • 两个数组的交集 II---简单

    题目:

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

    示例:

      输入: 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)呢。不过却是最快的,应该还要更详细的数学分析。可以看到,虽然有两个循环,可是每个数组都只遍历了一次,所以是O(nlogn)+O(n)=O(nlogn)

    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;
        }
    };
  • 相关阅读:
    时间工具类
    BEANUTIL 对象转JSON
    BeanUtil 对象转json
    导入jsp
    导入Excel加行公式和验证
    导入Excel
    导出Excel
    时间工具类
    python 装饰器的详细理解【多次实验】
    Python 爬虫 ajax爬取马云爸爸微博内容
  • 原文地址:https://www.cnblogs.com/manch1n/p/10308329.html
Copyright © 2011-2022 走看看