1. 哈希法
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
// 使较小长度的数组映射到map中,这样之后遍历 -- 到 0 的时候,就可以停止push_back
if(nums2.size() > nums1.size())
return intersect(nums2, nums1); // 这样做可以减少空间复杂度
unordered_map<int,int> map;
vector<int> res;
// 做映射
for(int a : nums2)
map[a]++;
for(int a : nums1)
{
if(map.count(a))
{
map[a]--;
res.push_back(a);
if(map[a] == 0)
map.erase(a);
}
}
return res;
}
};
2 .双指针
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
// 要先排序,时间主要花在这了
sort(nums1.begin(), nums1.end());
sort(nums2.begin(), nums2.end());
int size1 = nums1.size(), size2 = nums2.size();
int index1 = 0, index2 = 0;
vector<int> res;
while(index1 < size1 && index2 < size2)
{
if(nums1[index1] < nums2[index2])
index1++;
else if(nums1[index1] == nums2[index2])
{
res.push_back(nums1[index1]);
index1++;
index2++;
}
else
index2++;
}
return res;
}
};