持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天,点击查看活动详情
前言
说起算法,对于前端来说,好像离我们的工作挺遥远的,至少目前对我来说好像并没有什么用处。断断续续刷了大半年的Leetcode,一两百题是有刷到的,但是感觉并没有什么用,遇到重复的题,不看题解,大部分还是做不出来,能做出来的还是靠笨办法,很少能自己想到题解上面的最优解。现在的态度就是买一手保险吧,万一哪次面试正好遇到我刷过还记得到的题呢。
题目描述
给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2] 示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[9,4] 解释:[4,9] 也是可通过的
提示:
1 <= nums1.length, nums2.length <= 1000 0 <= nums1[i], nums2[i] <= 1000
简单解法
第一反应就是循环遍历一个数组,判断每一个元素是否在另一个数组中,最后在把数组去重。于是有了以下代码。
var intersection = function(nums1, nums2) {
const result = []
for(let i = 0;i<nums1.length;i++){
if(nums2.includes(nums1[i])){
result.push(nums1[i])
}
}
return [...new Set(result)]
};
最后原型结果看起来还不错,空间复杂度为n^2
,但是这道题归类在hash里面,显然不是想让你用数组方法求解。
hash解法
将循环内的includes
方法改为用hash
方法判断,可以降低空间复杂度为n
。
var intersection = function(nums1, nums2) {
let set = new Set(nums1)
let res = []
for(let i = 0;i<nums2.length;i++){
if(set.has(nums2[i])){
res.push(nums2[i])
}
}
return [...new Set(res)]
};
从运行结果来看,时间只优化了20ms,这是因为题目有限制数组长度小于1000,数据量比较小,所以看起来时间差不多,如果数据量过大,甚至可能会导致运行超时。
最后
一大早就定了闹钟起来看比赛,最气的是被碾压了,甚至没有看到第五把,果然把希望放在JDG身上是不靠谱的,看着状态大飞老师要拿第四冠了。