解法1:调用stl函数
sort函数排序,创建一个目标容器result,容量nums1,nums2小的那个,set_intersection函数求交集,但由于它结果返回的是目标容器的最后一个元素迭代器,所以再创建一个容器v1,将result容器的开始元素到result最后一个元素拷贝,输出v1
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
sort(nums1.begin(),nums1.end());
sort(nums2.begin(),nums2.end());
vector<int> result;
result.resize(min(nums1.size(),nums2.size()));
vector<int>::iterator it = set_intersection(nums1.begin(),nums1.end(),nums2.begin(),nums2.end(),result.begin());
vector<int> v1(result.begin(),it);
return v1;
}
};
解法2:
刚开始学哈希表,其实有一点蒙,看完这道题,我有点懂了。
首先不知道map的大家可以看看我之前写的map的文章。然后说这题的思路
首先,我们比较nums1和nums2的size,如果 nums1大,交换他俩的元素
然后,创建一个map容器,我觉得leetcode里边对我这种新手可能还是讲的不够细,这里我讲细一点,首先map容器里有一个key,一个value,对于这道题,nums1里的元素就对应map里面的key,每个元素的个数就对应value,所以当下边循环1执行完以后,map容器里应该是m={{2,2}}(这里我们用上边的例1,nums1和nums2的元素交换了哦!!!)
接着,执行循环2,遍历nums2的元素,if条件判断,是否m[num] > 0,符合条件,就把num对应的数写进result,
最后输出result
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
if(nums1.size()>nums2.size())
{
nums1.swap(nums2);
}
map<int,int> m;
for(int num : nums1) // 1
{
++m[num];
}
vector<int> result;
for(int num : nums2) // 2
{
if(m[num] > 0)
{
result.push_back(num);
--m[num];
}
}
return result;
}
};
解法3;排序加双指针
首先对两个数组进行排序,然后使用两个指针遍历两个数组。
初始时,两个指针分别指向两个数组的头部。每次比较两个指针指向的两个数组中的数字,如果两个数字不相等,则将指向较小数字的指针右移一位,如果两个数字相等,将该数字添加到答案,并将两个指针都右移一位。当至少有一个指针超出数组范围时,遍历结束
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
sort(nums1.begin(),nums1.end());
sort(nums2.begin(),nums2.end());
vector<int> result;
int index1 = 0, index2 = 0;
while(index1<nums1.size() && index2 < nums2.size())
{
if(nums1[index1] == nums2[index2])
{
result.push_back(nums1[index1]);
index1++;
index2++;
}else if(nums1[index1] > nums2[index2])
{
index2++;
}else{
index1++;
}
}
return result;
}
};