leetcode 349. 两个数组的交集 思考分析

92 阅读2分钟

题目

给定两个数组,编写一个函数来计算它们的交集。
在这里插入图片描述

1、暴力双for循环

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        vector<int> result;
        vector<int> res;
        if(nums1.size()==0 || nums2.size()==0) return result;
        for(int i=0;i<nums1.size();i++)
        {
            for(int j=0;j<nums2.size();j++)
            {
                if(nums1[i] ==nums2[j]) res.push_back(nums1[i]);
            }
        }
        if(res.size()==0) return result;
        sort(res.begin(),res.end());
        //进行去重
        for(int i=0;i<res.size()-1;i++)
        {
            if(res[i]!=res[i+1]) result.push_back(res[i]);
        }
        result.push_back(res[res.size()-1]);
        return result;
    }
};

2、利用哈希集合加速

容器的选择

1、map/multimap的几个特点以及操作

元素包含两部分(key,value),key和value可以是任意类型
根据元素的key自动对元素排序,因此根据元素的key可以进行很快定位
不能直接改变元素的key,可以通过[ ]直接存取元素值
map中不允许key相同的元素,multimap允许key相同的元素

操作效果
map.c产生空的map
c.size()返回元素个数
count(key)返回键值==key的元素个数
find(key)返回键值==key 的第一个元素,找不到的话返回end
lower_bound(key)返回键值>=key的第一个元素
upper_bound(key)返回键值>key的第一个元素
equal_range(key)返回键值==key的元素区间
c.insert(pos,e)在pos位置为起点插入e的副本,并返回新元素的位置
c.erase(val)移除所有值为val的元素,返回移除元素个数

2、set/multiset的几个特点

set使用平衡二叉树管理元素(红黑树)
set的每个元素值必须唯一,系统会自动将数据排序。他支持插入、删除、查找等操作,所有的操作都在logN时间之内完成,效率比较高。
set和multiset的区别是:set插入的元素不能相同,而multiset可以相同 操作指令同map

代码

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> result;
        //构建nums1的哈希集合,自动去重,
        //set(集合)是将容器内所有元素都能更具其键值自动排序,set元素的键值就是实值。set不允许两个元素有相同的键值
        unordered_set<int> nums1_res(nums1.begin(),nums1.end());
        for(int i=0;i<nums2.size();i++)
        {
            //在哈希集合中寻找是否存在nums2[i]的元素,如果是的把这个元素放入result的哈希表中
            if(nums1_res.find(nums2[i])!=nums1_res.end())
                result.insert(nums2[i]);	        //在集合中插入元素(自动去重处理)	
        }
        return vector<int>(result.begin(),result.end()); 
    }
};