题目来源:https://leetcode.cn/problems/intersection-of-two-arrays/description/
C++题解:因为这道题限制了数组元素的大小,所以我们可以用数组来应用哈希表(不过当元素数目较少时,会造成空间的浪费)。如示例1,我们找到在nums1找到‘1’,可以在新数组索引为1的位置记为true,所以如果在nums再遇到‘1’,新数组中索引为1的元素一直为1,则不会有重复问题;然后在nums2中遍历,当遇到‘2’时,如果新数组中索引为2的元素值为true,说明在nums1中出现过,可以添加到结果数组,同时更改新数组中索引为2的元素值为false,防止重复添加。
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
vector<int> res(0);
vector<bool> a(1001, false);
int len1 = nums1.size(), len2 = nums2.size();
for(int ii = 0; ii < len1; ii++) {
a[nums1[ii]] = true;
}
for(int ii = 0; ii < len2; ii++) {
if(a[nums2[ii]]){
res.push_back(nums2[ii]);
a[nums2[ii]] = false;
}
}
return res;
}
};
网上有用unordered_set来实现的,感觉更合适一点(但是因为我才刚开始学哈希表,所以不太会用,等我熟练了以后可能就有这种题解)。unordered_set底层实现也是哈希表。
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set; // 存放结果,之所以用set是为了给结果集去重
unordered_set<int> nums_set(nums1.begin(), nums1.end());
for (int num : nums2) {
// 发现nums2的元素 在nums_set里又出现过
if (nums_set.find(num) != nums_set.end()) {
result_set.insert(num);
}
}
return vector<int>(result_set.begin(), result_set.end());
}
};