独行者怎会有交集:两个数组的交集 II | 刷题打卡

138 阅读3分钟

“孤独的灵魂,不配拥有交集”,那两个数组一定会有交集吗?

题目描述

分类困难度👍👎
算法简单 (53.91%)460-
标签 哈希表| 双指针| 二分查找| 排序
公司 未知

给定两个数组,编写一个函数来计算它们的交集。

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

思路分析

首选暴力法,其中一个数组循环一遍,同时判断在不在第二个数组数组中,如果在就加到临时数组并从第二个数组中移除。如果硬要说“优化”的话,我也只能想到先比较两个数组的长度,定义中间变量,然后循环长度较小的那个数组。

AC 代码

暴力解法

/*
 * @lc app=leetcode.cn id=350 lang=javascript
 *
 * [350] 两个数组的交集 II
 */

// @lc code=start
/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var intersect = function (nums1, nums2) {
  const intersection = [];
  if(nums1.length > nums2.length) {
      let n = nums1
      nums1 = nums2
      nums2 = n
  }
  for (i of nums1) {
    if (nums2.indexOf(i) > -1) {
      intersection.push(i);
      nums2.splice(
        nums2.findIndex((item) => item === i),
        1
      );
    }
  }

  return intersection;
};
// @lc code=end


// 61/61 cases passed (100 ms)
// Your runtime beats 26.94 % of javascript submissions
// Your memory usage beats 82.1 % of javascript submissions (39.2 MB)

数组迭代

当然,碰巧您对数组操作的一些方法掌握的比较好,试图用起来:

/*
 * @lc app=leetcode.cn id=350 lang=javascript
 *
 * [350] 两个数组的交集 II
 */

// @lc code=start
/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
 var intersect = function(nums1, nums2) { 
    if(nums1.length > nums2.length) {
        let n = nums1
        nums1 = nums2
        nums2 = n
    }
    return nums1.filter(item => nums2.includes(item) && nums2.splice(nums2.indexOf(item), 1))
};
// @lc code=end

// 61/61 cases passed (80 ms)
// Your runtime beats 92.42 % of javascript submissions
// Your memory usage beats 99.16 % of javascript submissions (38.6 MB)

其实也只是把暴力法的思路用数组常用的api再实现一遍,其中:

  • filter: 方法创建一个新数组, 其包含通过所提供函数实现的测试(这里的条件是被 nums 包含)的所有元素。
  • includes: 方法用来判断一个数组是否包含一个指定的值,根据情况,如果包含则返回 true,否则返回false。
  • splice: 方法通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容。此方法会改变原数组。

总结

还是验证了大佬的观点,刷题能让您更加了解语言;这不 JavaScript 中数组操作常用的方法又巩固了一遍,但愿我不要忘记!

高深的解法暂时还没有研究,连基本的哈希表、二分查找等的概念,我都一无所知,怎么能愉快地刷题呢?

本文正在参与「掘金 2021 春招闯关活动」, 点击查看活动详情