LeetCode链接: link.
解题思路:
- 先用unordered_map统计nums1中每个元素出现的次数
- 遍历nums2,如果发现nums2中的e出现于unordered_map中,就将其存入v中,然后让m[e]自减,当记录e在字典中的值为0时,就将这条记录删除。
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
//对nums1数组进行次数的统计
unordered_map<int,int> m;
for(auto& e : nums1)
{
m[e]++;
}
vector<int> v;
for(auto& e : nums2)
{
if(m.count(e)) //说明两个数组都有这个值
{
v.push_back(e);
m[e]--;
if(um[e] == 0)
{
m.erase(e);
}
}
}
return v;
}
};
双指针法
我感觉这种解题思路更加能够想清楚。
- 定义两个指针分别指向数组的开始,比较大小,谁小指针就往后走,当一样大的时候,说明此时这个数就是要找的交集,添加到vector中,并且指针同时往后走,当其中一个数组先遍历完,那么也就结束了。
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
sort(nums1.begin(),nums1.end());
sort(nums2.begin(),nums2.end());
vector<int> v;
size_t begin1 = 0,end1 =nums1.size();
size_t begin2 = 0,end2 = nums2.size();
while((begin1 < end1) && (begin2 < end2))
{
if(nums1[begin1] < nums2[begin2])
{
begin1++;
}
else if(nums1[begin1] > nums2[begin2])
{
begin2++;
}
else
{
v.push_back(nums1[begin1]);
begin1++;
begin2++;
}
}
return v;
}
};