两个数组的交集 II
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2,2]
示例 2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [4,9]
说明:
输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
我们可以不考虑输出结果的顺序。
思路:两个循环一次比较两个数组的元素,如果相等就把当前元素存入ans数组中,并且把第二个数组中的当前位置变为NULL,然后跳出循环。
编译不通过,变为NULL后编译器认为元素为零,所以结果中出现很多零。
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
vector<int>ans;
for(auto &i:nums1){
for(auto &j:nums2){
if(j==i){
ans.push_back(i);
j=NULL;
break;
}
}
}
return ans;
}
};
问题出在 j=NULL那一步,其实只要判断并传入相同元素后,把两个当前元素任意赋不相等的值即可。
(搬来别人的代码)
暴力查找:
`class Solution {
public:
vector intersect(vector& nums1, vector& nums2) {
vector ret;
for(vector::iterator it1 = nums1.begin(); it1 != nums1.end(); it1++) {
for(vector::iterator it2 = nums2.begin(); it2 != nums2.end(); it2++) {
if(*it1 == *it2) {
ret.push_back(*it1);
*it1 = -10086;
*it2 = -10085;
}
}
}
return ret;
}
};
作者:chenlele
链接:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii/solution/liang-ge-shu-zu-de-jiao-ji-ii-by-gpe3dbjds1/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。`;
暴力法更好的写法:
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
vector<int> res;
vector<int>::iterator it;
for(int i=0;i<nums1.size();i++)
{
it=find(nums2.begin(),nums2.end(),nums1[i]);
if(it!=nums2.end())//查找到元素
{
res.push_back(*it);
nums2.erase(it);//删除元素
}
}
return res;
}
}
作者:chenlele
链接:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii/solution/liang-ge-shu-zu-de-jiao-ji-ii-by-gpe3dbjds1/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
还有更高级的解法,如哈希表,双指针留着二刷时再写。
其实 标准库中提供了求两个集合交集的函数:
C++ STL 提供求交集的函数 set_intersection( ) 、求集合差的函数 set_difference( ) 和合并两个集合的函数 set_union( )
首先传递的容器必须是排序的,set 容器中元素默认是排序的,而 vector 需要调用 sort 函数进行排序。其次 set_intersection( )中最后存放交集的容器的容量必须要足够大到能放下所有的元素,即函数只执行复制,不是插入!但是模板 insert_iterator 可以将复制转换为插入,可以解决该问题。
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
vector<int> res;
set<int> cod1(nums1.begin(),nums1.end());
set<int> cod2(nums2.begin(),nums2.end());
std::set_intersection(cod1.begin(),cod1.end(),cod2.begin(),cod2.end(),insert_iterator<vector<int>>(res,res.begin()));
return res; // res:2
}
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) { vector<int> res; std::sort(nums1.begin(),nums1.end()); std::sort(nums2.begin(),nums2.end()); std::set_intersection(nums1.begin(),nums1.end(),nums2.begin(),nums2.end(),insert_iterator<vector<int>>(res,res.begin())); return res; // res:2,2 }
版权声明:本文为CSDN博主「Sim0Hayha」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Sim0Hayha/article/details/80043558
所以程序可以这样:
#include
class Solution {
public:
vector intersect(vector& nums1, vector& nums2) {
vector ret;
std::sort(nums1.begin(), nums1.end());
std::sort(nums2.begin(), nums2.end());
std::set_intersection(nums1.begin(), nums1.end(), nums2.begin(), nums2.end(), std::back_inserter(ret));
return ret;
}
};
作者:shan-35
链接:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii/solution/zui-jian-dan-de-xie-fa-by-shan-35/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
拜拜