两个数组的交集 II
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]
说实话一看到这种题,就想到了for循环的嵌套。当然是一定运行不出来的。所以我想到了一个办法。就是先排序,给nums1和nums2。然后 我们以短的数组为标准。假如现在是nums1
num1=1,1,2,5 nums2 = 1,2,2,2,4,5这是已经排序好的。
nums1的第一个与nums2的数组比 有一个一样的这时 就记录一下 。nums2继续增加。如果nums2的值大于num1的值了说明 不可能一样了对吧。这个时候num1增加。
代码方面怎么写呢。这个双循环肯定可以做,但是leetcode肯定也会崩。所以我们必须使用o(n)复杂度的。好像只能用双指针。刚好leetcode nums是容器。直接可以用迭代器。
nums1 一个指针(it1) nums2一个指针(it2)。
nums[1]<nums[2] 则it1++;
nums[1] = nums[2] 则都加1 记录一下
nums[1]>nums[2] 则it2++。
核心已经写完了。
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
vector<int> mubiao;
sort(nums1.begin(),nums1.end());
sort(nums2.begin(),nums2.end());//给两个数组排序
vector<int>::iterator it1=nums1.begin(),it2 = nums2.begin();
while(it1!=nums1.end()&&it2!=nums2.end())
{
if(*it1<*it2){
it1++;
}else if(*it1 == *it2){
mubiao.push_back(*it1);
it1++;
it2++;
}else if(*it1 > *it2)
{
it2++;
}
}
return mubiao;
}
};
看了一下,下面的评论好像都是用双指针做的。如果有更好的方法 可以分享一下