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; } };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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代理技术深度解析与实战指南