一、题目链接
二、题目
三、分析
法一:
去重+查找:先对两个数组用set去重,再遍历其中一个数组看这个数组中的元素在另一个数组中出现的次数若为1,那么就push_back到vector< int >里。
法二:
找交集可以用去重+遍历的比对算法:依次比较,小的++;相等的就是交集,同时++。其中一个结束就结束了。(这个算法思路还可以用在找差集:依次比较。小的就是差集,小的++;相等就同时++。其中一个结束就结束了,没结束的那个剩下的元素也是差集。)算法效率比法一高,只需遍历一遍,时间复杂度是O(N)。
四、编写代码
// 法一
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
// 去重
set<int> s1(nums1.begin(), nums1.end());
set<int> s2(nums2.begin(), nums2.end());
vector<int> v;
for (auto e : s1)
{
// 查找
if (s2.count(e))
{
v.push_back(e);
}
}
return v;
}
};
// 法二
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
// 去重
set<int> s1(nums1.begin(), nums1.end());
set<int> s2(nums2.begin(), nums2.end());
auto it1 = s1.begin(), it2 = s2.begin();
vector<int> v;
while (it1 != s1.end() && it2 != s2.end())
{
if (*it1 < *it2)
{
++it1;
}
else if (*it1 > *it2)
{
++it2;
}
else
{
v.push_back(*it1);
++it1, ++it2;
}
}
return v;
}
};