“孤独的灵魂,不配拥有交集”,那两个数组一定会有交集吗?
题目描述
| 分类 | 困难度 | 👍 | 👎 |
|---|---|---|---|
| 算法 | 简单 (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 春招闯关活动」, 点击查看活动详情