题目链接
题目描述
示例
示例1:
输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2,2]
说明
- 输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。
- 我们可以不考虑输出结果的顺序。
思路
思路1:排序+双指针
可以看做0349-两个数组的交集的简化思路2:哈希表
题目允许无序,可重复,因此我们可以使用std::unorder_map来完成这个题目。进阶
- 如果给定的数组已经排好序呢?你将如何优化你的算法?
答:使用双指针。
- 如果
nums1的大小比nums2小很多,哪种方法更优?
答:对较短的数组进行哈希表的操作,哈希表的大小不会超过较短的数组的长度,减小空间的开销。
- 如果
nums2的元素存储在磁盘上,内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
答:不能一次性加载到内存中,则无法排序,只能采用思路2的方法。
题解
思路1:排序+双指针
class Solution {public:vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {sort(nums1.begin(), nums1.end());sort(nums2.begin(), nums2.end());int i = 0, j = 0;vector<int> ans;while (i < (int)nums1.size() && j < (int)nums2.size()) {if (nums1[i] == nums2[j]) {ans.emplace_back(nums1[i]);++i;++j;} else if (nums1[i] < nums2[j]) {++i;} else {++j;}}return ans;}};
思路2:哈希表
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> count;vector<int> ans;for (int num : nums1) {++count[num];}for (int num : nums2) {if (count.count(num) && count[num] > 0) {ans.emplace_back(num);--count[num];}}return ans;}};
