力扣349. 两个数组的交集
题目来源(力扣):
https://leetcode.cn/problems/intersection-of-two-arrays/
题目描述:
给定两个数组 nums1 和 nums2 ,返回它们的交集。输出结果中的每个元素一定是 唯一 的。我们可以不考虑输出结果的顺序 。
基本思路:
对数组1构造哈希表m,再扫描一遍数组2,如果数组2中的元素在哈希表m(这里用的是std::unordered_map)中,则加入到答案中
由于答案在逻辑上是集合,而实际上返回的是vector数组,所以元素不可以重复
因此,数组2中的数如果在哈希表m中,则更新对应元素的状态
具体到代码中,在数组1的基础上构造的哈希表m的每个元素的映射值为1,在扫描数组2的过程中,将合法的数加入到答案vector中,并且更新哈希表中元素的映射值为2
如下:
代码实现:
class Solution
{
public:
vector<int> intersection(vector<int> &nums1, vector<int> &nums2) //注意这里的返回值是vector<int>
{
unordered_map<int, int> m; //字典(哈希表)
vector<int> ans;
for (int i : nums1) //等价于 for(int k=0;k<nums.size();k++) m[nums[k]]=1; //下同
{
m[i] = 1;
}
for (int j : nums2)
{
if (m[j] == 1)
{
m[j] = 2; 防止元素重复
ans.push_back(j);
}
}
return ans;
}
};
《代码随想录》写法
代码随想录中使用的是unordered_set,
另外还要学会set转vector、vector转set等的写法
class Solution
{
public:
vector<int> intersection(vector<int> &nums1, vector<int> &nums2)
{
unordered_set<int> m(nums1.begin(), nums1.end()); // 将数组1转化为集合
unordered_set<int> ans;
for (int i : nums2)
{
if (m.find(i) != m.end()) // 如果数组中的数i也在集合中,则加入到答案ans中
ans.insert(i);
}
return vector<int>(ans.begin(), ans.end()); // 转换为vector类型
}
};
补充
c++中,set包括std::set std::multiset std::unordered_map
| 集合 | 底层实现 | 是否有序 | 数值是否可以重复 | 能否修改数值 | 查询效率 | 增删效率 |
|---|---|---|---|---|---|---|
| std::set | 红黑树 | 是 | 否 | 否 | logn | logn |
| std::multiset | 红黑树 | 是 | 是 | 否 | logn | logn |
| std::unordered_map | 哈希表 | 否 | 否 | 否 | 1 | 1 |
浙公网安备 33010602011771号