第一个:应该想到stl集合(set) :天然去重,满足题意。
第二个:我想到用两个map,然后分别定义两个map的迭代器,进行双重for循环的扫描来做。详情见代码。(一遍ac)
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
map<int,int> m1;
map<int,int> m2;
for(auto i : nums1)
{
m1[i]=m1[i]+1;
}
vector<int> v;
for(auto j : nums2)
{
m2[j]=m2[j]+1;
}
map<int,int>::iterator it1;
map<int,int>::iterator it2;
for(it1=m1.begin();it1!=m1.end();it1++)
{
for(it2=m2.begin();it2!=m2.end();it2++)
{
if(it1->first==it2->first)
{
int temp=min(it1->second,it2->second);
for(int k=0;k<temp;k++)
{
v.push_back(it1->first);
}
}
}
}
return v;
}
};
follow up1: 如果两个数组都是排好序的,那么可以,用双指针的方法,为每个数组设置一个指针。然后分别都从最左边开始往后走,如果遇到相同的就把值加进去,然后继续往后走。
follow up 2:如果一个数组的size很小,另一个数组的size很大。那么采用哪种方法好。
如果借助fllow up1的思想,那么对那个较长的数组先排序的时间复杂度将达到nlogn(sort函数的时间复杂度)。与用hash_map和set做的时间复杂度分析,没怎么听懂,详见b站清华大佬。
follow up 3:如果其中一个数组很大,快到硬盘的限制了,当然,也就无法一次性放到内存里。那么怎么做。可以先把较小的那个用hash_map或者其它搞到内存里。然后不断从硬盘里取一块较大的那个的数据,进行处理。