题目描述
给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
解题思路
将数组一映射在哈希表中。将数组二中元素一一与哈希表比对,若出现,则将该元素加入结果数组。
-
数组一的哈希表:两种方法实现。
方法一:利用数组;
方法二:利用unordered_set, 这种数据结构可以理解为经过去重的无限存储的数组,底层实现为哈希值的映射。 -
结果数组:本题中,要求结果去重,即结果数组元素唯一,因此利用unordered_set(自带去重)特性,将结果先保存在unordered_set中,最后转存为数组返回。
-
set数据结构共分三种set、unordered_set、multiset.
-
unordered_set:优先应用。它的底层实现是哈希值的映射,可以理解为经过去重的无限存储的数组。
-
set: 底层实现为红黑树,集合有序时应用。
-
multiset: 底层实现为红黑树,集合有序+有重复时应用。
关于set的函数调用
- 定义:
unordered_set<int> nums_set - 插入元素:
nums_set.insert(a) - 寻找元素(若找不到则返回最后一个元素):
nums_set.find(a)!=nums1_set.end() - 将set赋值给数组:
vector<int>(result_set.begin(),result_set.end())
set代码
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> nums1_set;
unordered_set<int> result_set;
\
for(int num : nums1){
nums1_set.insert(num);
}
\
for(int num : nums2){
if(nums1_set.find(num)!=nums1_set.end()){
result_set.insert(num);
}
}
return vector<int>(result_set.begin(),result_set.end());
\
\
\
}
};
数组代码
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set; // 存放结果,之所以用set是为了给结果集去重
int hash[1005] = {0}; // 默认数值为0
for (int num : nums1) { // nums1中出现的字母在hash数组中做记录
hash[num] = 1;
}
for (int num : nums2) { // nums2中出现话,result记录
if (hash[num] == 1) {
result_set.insert(num);
}
}
return vector<int>(result_set.begin(), result_set.end());
}
};