Leetcode 349. 两个数组的交集
题目要求:给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
解法一: unordered_set
其具体思路和步骤:
- 创建一个unordered_set,将数组nums1中的所有元素都加入该unordered_set中。
- 创建一个新的unordered_set(即result_set),准备将nums2中和nums1相同的元素放入其中。
- 遍历数组nums2,对于nums2中的每个元素,判断该元素是否在nums1的unordered_set中出现。
- 如果该元素在nums1的unordered_set中出现,则将该元素加入到新的unordered_set(即result_set)中。
- 最后,将新的unordered_set(即result_set)转换为vector,并返回即可。
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());
}
};
注意:直接使用set 不仅占用空间比数组大,而且速度要比数组慢,set把数值映射到key上都要做hash计算的。
该解法时间复杂度为O(m+n),其中m和n分别是两个数组的长度。相比于使用其他数据结构,例如vector和set,使用unordered_set可以达到更高的效率。同时,unordered_set还可以帮助去重,以及判断当前元素是否出现在某个容器中。
在C++的unordered_set中,插入重复元素不会导致数据结构中存在重复。插入已经存在的值会被忽略,unordered_set所维护的数据结构保持不变。
具体而言,当我们要插入一个重复元素时,unordered_set的底层实现将查找表中已经存在该元素的情况,如果该元素被发现,插入操作直接被忽略。
因此,在插入重复元素后,unordered_set所维护的元素个数以及内部数据结构都不会发生任何变化,同时返回值表明插入操作失败,因为元素已经存在。
数组当哈希表的解法
参考代码随想录内容