题源:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2y0c2/
题解一:使用unordered_map函数,将nums1中的数组元素作为key,数量作为value,构建m;然后遍历nums2中的元素,以每个元素作为目标在m中进行查找,若找到且值还大于或等于1,则将该元素作为结果存储在nums1中。(可以去题源看官方解答,此题也是看得解析)
代码 :
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
if(nums1.size()>nums2.size()){
return intersect(nums2,nums1);///方法名叫intersect,是递归调用了这个方法本身而不是其他的三方函数
}
unordered_map<int,int>m;
for(auto n:nums1){
m[n]++;
}
int k=0;
for(auto x:nums2){
auto itera=m.find(x);
if(itera!=end(m)&&--itera->second>=0){
nums1[k++]=x;
}
}
return vector(begin(nums1),begin(nums1)+k);
}
};
题解二:
代码:先对两个数组进行排序,然后使用双指针对两个数组进行遍历,实现细节看代码。
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
if(nums1.size()>nums2.size()){
return intersect(nums2,nums1);
}
sort(nums1.begin(),nums1.end());
sort(nums2.begin(),nums2.end());
int k=0;
for(int i=0,j=0;i<nums1.size()&&j<nums2.size();){
if(nums1[i]==nums2[j]){
nums1[k++]=nums1[i];
i++;j++;
}
else if(nums1[i]<nums2[j]){
i++;
}
else{
j++;
}
}
return vector(begin(nums1),begin(nums1)+k);
}
};