LeetCode 350: 两个数组的交集 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]
说明:
输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。
我们可以不考虑输出结果的顺序。
进阶:
如果给定的数组已经排好序呢?你将如何优化你的算法?
如果 nums1 的大小比 nums2 小很多,哪种方法更优?
如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
解题
哈希表
思路与两个数组的交集I思路大致相同,用一个哈希表记录其中一个数组出现的数字,并统计出现的次数,再遍历第二个数组,如果当前数字在哈希表中对应的次数不为0,则把该数字添加到结果中。
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
unordered_map<int, int> int_int;
for (auto &i : nums1)
++int_int[i];
vector<int> result;
for (auto &i : nums2){
if (int_int[i] > 0){
result.emplace_back(i);
--int_int[i];
}
}
return result;
}
};
这里可以优化的是进阶中第二条内容,针对两个数组大小,取较小地数组来建立哈希表。
排序
针对进阶中第一条,将两个数组排序,然后逐个比对,对应位置元素相等时将该值保存到结果中。
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
sort(nums1.begin(), nums1.end());
sort(nums2.begin(), nums2.end());
vector<int> result;
for (int i=0, j=0; i < nums1.size() && j < nums2.size();){
if (nums1[i] < nums2[j])
++i;
else if (nums2[j] < nums1[i])
++j;
else if (nums1[i] == nums2[j]){
result.emplace_back(nums1[i]);
++i;
++j;
}
}
return result;
}
};