《LeetCode之每日一题》:51.两个数组的交集 II
Posted 是七喜呀!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode之每日一题》:51.两个数组的交集 II相关的知识,希望对你有一定的参考价值。
题目链接: 两个数组的交集 II
有关题目
给定两个数组,编写一个函数来计算它们的交集。
给定两个数组,编写一个函数来计算它们的交集。
给定两个数组,编写一个函数来计算它们的交集。
说明:
输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。
我们可以不考虑输出结果的顺序。
进阶:
如果给定的数组已经排好序呢?你将如何优化你的算法?--对应法二
如果 nums1 的大小比 nums2 小很多,哪种方法更优?--对应法一
如果 nums2 的元素存储在磁盘上,内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?--对应法一
题解
法一:哈希表
参考官方题解
为了降低空间复杂度,首先遍历较短的数组并在哈希表中记录每个数字以及对应出
现的次数,然后遍历较长的数组得到交集。
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
if (nums1.size() > nums2.size())
return intersect(nums2,nums1);//降低复杂度我们人为控制调用函数中的第一个数组的大小小于第二个
unordered_map<int,int> m;
for (int num1 : nums1)
++m[num1];//录入键值对
vector<int> intersection;
for (int num2 : nums2)
{
if (m.find(num2) != m.end())
{
intersection.push_back(num2);
--m[num2];
}
if (m[num2] == 0)//num2出现的次数使用完,移除该元素
m.erase(num2);
}
return intersection;
}
};
法二:排序 + 双指针
思路:
两个下标idx1,idx2分别遍历排好序的数组
超过数组的长度结束遍历
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
int len1 = nums1.size();
int len2 = nums2.size();
sort(nums1.begin(),nums1.end());
sort(nums2.begin(),nums2.end());//排序
vector<int> intersection;
int idx1 = 0,idx2 = 0;
while(idx1 < len1 && idx2 < len2)
{
if (nums1[idx1] > nums2[idx2])
idx2++;
else if (nums1[idx1] < nums2[idx2])
idx1++;
else
{
intersection.push_back(nums1[idx1]);
idx1++;
idx2++;
}
}
return intersection;
}
};
以上是关于《LeetCode之每日一题》:51.两个数组的交集 II的主要内容,如果未能解决你的问题,请参考以下文章
《LeetCode之每日一题》:275.两个数组的交集 II
《LeetCode之每日一题》:249.两数之和 II - 输入有序数组