方法一:使用哈希数据结构:unordered_set
//使用一种哈希数据结构:unordered_set ,使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复
如下图所示,将nums1存进unordered_set之后就可直接去重
class Solution {
//使用一种哈希数据结构:unordered_set
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> res_set;//用于存放结果
unordered_set<int> num_set(nums1.begin(),nums1.end());//将nums1去重存放进哈希表中
for(int num:nums2){
if(num_set.find(num)!=num_set.end()){//num元素存在于num_set中,说明是重复元素
res_set.insert(num);
}
}
return vector<int>(res_set.begin(),res_set.end());
}
};
方法二: 使用哈希数据结构:unordered_map
细节看注释
class Solution {
//使用一种哈希数据结构:unordered_set
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_map<int,int> map;
vector<int> res;
for(int num1:nums1){
map[num1]++;//先将nums1放进哈希表map中
}
for(int num2:nums2){//遍历nums2
if(map[num2]!=0){//发现有map[num2]不为0,表明在数组nums1中已经存在该元素,属于重复元素,符合要求
res.push_back(num2);
map[num2]=0;//还原为0,是避免数组nums2中有多个元素num2,会导致输出结果重复
}
}
return res;
}
};
使用哈希数据结构:unordered_map ,由于unordered_set会自动去重,因此就使用unordered_map
细节见注释
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
unordered_map<int,int> map;
vector<int>res;
for(int num1:nums1){
map[num1]++;//先将nums1中的元素放进哈希表
}
for(int num2:nums2){//遍历nums2
if(map[num2]!=0){//数组nums2中元素num2不为0,表明是重复元素,符合要求
res.push_back(num2);
map[num2]--;//将重复元素减1(因为题目要求重复的也放进res中),如果后面map【num2】还不为0,说明不止重复一次
}
}
return res;
}
};