题目:给定两个数组 nums1
和 nums2
,返回 它们的 交集。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
分析:首先我们需要设置一个哈希表,哈希表的索引是nums1中的元素,元素值是nums1中元素出现的次数。然后遍历nums2,判断nums2中的每个元素是否在nums1中出现过,如果出现过则放入输出数组中,否则直接访问下一个元素。
我们可以选择使用unordered_set(相比于有序容器set,查找操作更迅速;相比于multiset,它可以控制元素不重复,更有利于交集的求解)作为哈希表,但是不能使用下标访问,只能使用迭代器访问。
如果想要通过设置下标访问,可以用数组或者map类型的容器。如果使用数组需要创建record[1000],因为题目中给出了nums1和nums2的元素值的范围。如果使用map则不需要考虑大小问题。
unordered_set具体实现代码如下:
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> set_result;
unordered_set<int> hash(nums1.begin(), nums1.end());
for(int i = 0; i < nums2.size(); i++) {
if(hash.find(nums2[i]) != hash.end()) {
set_result.insert(nums2[i]);
}
}
vector<int> result(set_result.begin(), set_result.end());
return result;
}
};
运行结果如下所示:
数组具体代码实现如下:
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> set_result;
int record[1000] = {0};
for(int i = 0; i < nums1.size(); i++) {
record[nums1[i]] = 1;
}
for(int i = 0; i < nums2.size(); i++) {
if(record[nums2[i]] == 1) {
set_result.insert(nums2[i]);
}
}
vector<int> result(set_result.begin(), set_result.end());
return result;
}
};
运行结果如下所示:
unordered_map代码具体实现方法:
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> set_result;
unordered_map<int,int> hash;
for(int i = 0; i < nums1.size(); i++) {
hash[nums1[i]] = 1;
}
for(int i = 0; i < nums2.size(); i++) {
if(hash[nums2[i]] == 1) {
set_result.insert(nums2[i]);
}
}
vector<int> result(set_result.begin(), set_result.end());
return result;
}
};
运行结果如下所示: