题目
给定两个数组 nums1
和 nums2
,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
解题思路
集合 | 底层实现 | 是否有序 | 数值是否可以重复 | 能否更改数值 | 查询效率 | 增删效率 |
---|---|---|---|---|---|---|
std::set | 红黑树 | 有序 | 否 | 否 | O(log n) | O(log n) |
std::multiset | 红黑树 | 有序 | 是 | 否 | O(log n) | O(log n) |
std::unordered_set | 哈希表 | 无序 | 否 | 否 | O(1) | O(1) |
映射 | 底层实现 | 是否有序 | 数值是否可以重复 | 能否更改数值 | 查询效率 | 增删效率 |
---|---|---|---|---|---|---|
std::map | 红黑树 | key有序 | key不可重复 | key不可修改 | O(log n) | O(log n) |
std::multimap | 红黑树 | key有序 | key可重复 | key不可修改 | O(log n) | O(log n) |
std::unordered_map | 哈希表 | key无序 | key不可重复 | key不可修改 | O(1) | O(1) |
前面我们讲到,题目是要求寻找某个数的话,可以优先考虑哈希法。
如果哈希值比较少、特别分散、跨度非常大,使用数组会造成空间的浪费,这一题就符合这个条件,所以我们采用无重复无序的unordered_set
- 先遍历nums1将里面的元素存入一个unordered_set(不会有重复值)
- 再遍历nums2里的元素,用find方法找unordered_set中有无这个元素,有则返回key值,无则指向end
- 有这个元素就存入一个result_set的unordered_set,同样,也不会有重复值
下面是代码实现
//采用底层实现是哈希表的unordered_set解决
#include <vector>
#include <unordered_set>
using namespace std;
class Solution
{
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2)
{
unordered_set<int> result_set;
unordered_set<int> nums(nums1.begin(), nums1.end());
for (int num : nums2)
{
if (nums.find(num) != nums.end())
{
result_set.insert(num);
}
}
return vector<int>(result_set.begin(), result_set.end());
}
};