描述

给定两个数组,编写一个函数来计算它们的交集,不要求顺序
示例 1:

  1. 输入: nums1 = [1,2,2,1], nums2 = [2,2]
  2. 输出: [2,2]

示例 2:

  1. 输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
  2. 输出: [4,9]

说明:

  • 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
  • 我们可以不考虑输出结果的顺序。
    进阶:
  • 如果给定的数组已经排好序呢?你将如何优化你的算法?
  • 如果 nums1 的大小比 nums2 小很多,哪种方法更优?
  • 如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

解题思路

一 ,数组排序,然后累加判断

  • 将数组排序是为了更加有效地进行判断交集元素,因为如果最小元素都无法开始匹配,意味着两个数组中不会有交集,同时也是为了进一步的进行匹配。
  • 在进行交集判断时,用到了两个累加的数组,当不符合相等也就是交集时,累加一方的元素;当存在交集时,两方同时计数+1,继续寻找相同的元素。
  1. /**
  2. * @param {number[]} nums1
  3. * @param {number[]} nums2
  4. * @return {number[]}
  5. */
  6. var intersect = function(nums1, nums2) {
  7. let len1= nums1.length
  8. let len2 = nums2.length
  9. let newArr = []
  10. if(!nums1 || !nums2 || len1 === 0 || len2 === 0){
  11. return newArr
  12. }
  13. nums1.sort((a,b) =>{
  14. return a- b
  15. })
  16. nums2.sort((a,b) =>{
  17. return a- b
  18. })
  19. let i = 0
  20. let j = 0
  21. while(i<len1 || j<len2){
  22. if(nums1[i]<nums2[j]){
  23. i++
  24. }else if(nums1[i]>nums2[j]){
  25. j++
  26. } else {
  27. if(nums1[i] === nums2[j]){
  28. newArr.push(nums1[i])
  29. }
  30. if(i<len1-1){
  31. i++
  32. }else{
  33. break
  34. }
  35. if(j<len2-1){
  36. j++
  37. }else{
  38. break
  39. }
  40. }
  41. }
  42. return newArr
  43. };