小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
349. 两个数组的交集
题目描述
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2]
示例 2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [9,4]
暴力法
使用集合的查找算法,判断nums1中的元素在nums2中是否存在。 常用查找算法:【c++常用查找算法】
class Solution
{
public:
vector<int> intersection(vector<int> &nums1, vector<int> &nums2)
{
// 返回结果数组
vector<int> ret;
for (int i = 0; i < nums1.size(); i++)
{
// 在nums2中查找nums1中的元素
vector<int>::iterator it = find(nums2.begin(), nums2.end(), nums1[i]);
// 如果找到
if (it != nums2.end())
{
// 再判断结果数组中是否已经存在
vector<int>::iterator it2 = find(ret.begin(), ret.end(), nums1[i]);
// 不存在,将数字添加到结果数组中
if (it2 == ret.end())
{
ret.push_back(nums1[i]);
}
}
}
return ret;
}
};
哈希法
- 1、题述中说明了不考虑元素的顺序,而且去重了。
- 2、题目限制了数值的大小时可以使用数组来解哈希类的题目
- 3、考虑到上面两个问题,我们可以使用set集合
- 4、set集合分为
setmulti_setunordered_set - 5、本题选择使用
unordered_set
class Solution
{
public:
// 哈希法
vector<int> intersection(vector<int> &nums1, vector<int> &nums2)
{
// 返回结果数组
vector<int> ret;
//对nums1和nums2进行去重处理
unordered_set<int> nums1_set(nums1.begin(), nums1.end());
unordered_set<int> nums2_set(nums2.begin(), nums2.end());
// 遍历去重后的数组nums1_set,在nums2_set中查找
for (int num : nums1_set)
{
unordered_set<int>::iterator it = nums2_set.find(num);
if (it != nums2_set.end())
{
ret.push_back(num);
}
}
return ret;
}
};