leetcode 350.两个数组的交集Ⅱ

这题是“两个数组的交集”问题的第二版,多了一个“输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。”这个要求。

但仍旧可以用哈希法来做。对其中数组建立哈希表,其中键为元素值,值为元素频率。遍历另一个数组的元素,每在哈希表中找到相同元素,那么就把其对应频率减1并把数组当前元素放入答案数组。若发现频率已经为0,则不再放入答案数组。

这样子,时间复杂度为O(m|n),空间复杂度为O(n|m)。若两数组长度差异比较大,那么就需要在两个复杂度中做取舍,是要空间优化还是时间优化。

 

在第一版中,没有那个要求的限制,还可以使用二分查找。思路是对其中一个数组排序,遍历另一个数组,搜索有序数组的时候就用二分查找。找到的结果放入集合中。这个方法并不适用于第二版。而且说实话实现繁琐且效果一般。

 

最简单的办法,就是排序两个数组,用双指针法。时间复杂度为O(nlogn+mlogm)。这在算法导论中是很经典的例子。实现代码如下。

复制代码
class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        sort(nums1.begin(),nums1.end());
        sort(nums2.begin(),nums2.end());
        int len1=nums1.size(),len2=nums2.size(),i=0,j=0;
        vector<int> ans;
        while (i!=len1&&j!=len2){
            if(nums1[i]==nums2[j]){
                ans.push_back(nums1[i]);
                ++i;++j;
            } else if (nums1[i]>nums2[j]){
                ++j;
            } else{
                ++i;
            }
        }
        return ans;
    }
};
复制代码

 

posted @   布羽  阅读(119)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示