给定两个数组,编写一个函数来计算它们的交集。
示例1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
示例2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
整体思路:
(1)我的思路:利用栈来写,首先利用栈去掉nums2中重复的数字,然后将nums2和num1合并,再次利用栈来判断是否里边有重复的数字,如果有,则把重复的数字归到一个新的数组中去,最后输出数组即可,利用栈时都要先排好序。代码复杂结果运行时间也出错了,不想拯救了!!!
(2)官方思路:看了官方解答,感觉真简单!!!利用两个哈希表即可,利用哈希表对第1个数组进行去重,加到第1个哈希表中去,从第2个数组中找出在第1个数组中也存在的数字加入到第2个哈希表中去,最后返回第2个哈希表即可!
代码题解:
1.我的错误代码(runtime error)
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
int m=nums1.size();
int n=nums2.size();
int left=0;
sort(nums2.begin(),nums2.end());
stack<int>st;
for(int i=0;i<n;i++)
{
if(st.empty()||st.top()!=nums2[i])
{
st.push(nums2[i]);
}
else
continue;
}
vector<int>nums;
int i=0;
while(!st.empty())
{
nums[i]=st.top();
st.pop();
i++;
}
vector<int>nums0;
int t=nums.size();
nums.resize(t+m);
for(int i=t;i<m+t;i++)
{
nums[i]=nums1[i];
}
sort(nums.begin(),nums.end());
stack<int>st0;
for(int j=0;j<nums.size();j++)
{
if(st0.empty()||st0.top()!=nums[j])
{
st0.push(nums[j]);
}
else{
nums0[left]=nums[j];
left++;
}
}
return nums0;
}
};
2.正确题解
这个题解是看的一个大佬的,自己始终不明白最后的set为什么想要转换成数组只能排序后转换!!!
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
set<int>s(nums1.begin(),nums1.end());
set<int>ans;
for(auto num:nums2)
{
if(s.count(num))
ans.insert(num);
}
return vector<int>(ans.begin(),ans.end());
}
};