题目
给定两个数组,编写一个函数来计算它们的交集。
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()); }
};