初级算法:两个数组交集

两个数组的交集 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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

拜拜

发布了36 篇原创文章 · 获赞 0 · 访问量 626

猜你喜欢

转载自blog.csdn.net/weixin_43199933/article/details/102730945