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 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

解题思路

**哈希**。
把较短的数组按(元素值,出现次数)存储在hash表中,然后遍历较长数组,判断该元素是否存在于hash表中,若存在则输出到结果集中,并把hash表中该元素出现次数减一,注意还需判断的是当该元素个数等于零时,将其移出hash表。

代码实现

  1. class Solution {
  2. public:
  3. vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
  4. int n1 = nums1.size();
  5. int n2 = nums2.size();
  6. //为了降低空间复杂度,把较短的数组记录在hash表中
  7. if (n1 > n2) {
  8. return intersect(nums2, nums1);
  9. }
  10. unordered_map<int,int> map1;
  11. for(int num : nums1) {
  12. map1[num]++;
  13. }
  14. vector<int> res;
  15. for(int num : nums2) {
  16. if(map1.count(num)) {
  17. res.push_back(num);
  18. map1[num]--;
  19. if(map1[num] == 0)
  20. map1.erase(num);
  21. }
  22. }
  23. return res;
  24. }
  25. };