题纲 算法
给定两个数组,编写一个函数来计算它们的交集。数组
示例 :函数
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [4,9]
说明:优化
方法1:spa
这种方法原则上比较暴力对全部的数都进行了一次遍历比较,同时清空了对比数组中当前对比相同的值,以防重复检测
/** * @param {number[]} nums1 * @param {number[]} nums2 * @return {number[]} */ var intersect = function(nums1, nums2) { var arr = []; for(var i=0;i<nums1.length;i++){ for(var j=0;j<nums2.length;j++){ if(nums1[i] === nums2[j]) { arr.push(nums1[i]) nums2[j]=null; break; } } } return arr; };
方法二:code
这个方法是在作完方法一之后想到的优化方法
方法一在两个对比数组基数大了之后须要循环的次数成指数上升,
方法二 则使用一个对象做为中间存储变量,将其中一个做为参照的数组映射入对象中,
以数组的值为KEY,对象值是这个映射进去的数组key在数组中出现的次数,
再循环对比数组去取obj中是否有这个key有则说明相同,将该key的值减一,以此类推
/** * @param {number[]} nums1 * @param {number[]} nums2 * @return {number[]} */ var intersect = function(nums1, nums2) { var arr = [], obj = {}; for(var i=0;i<nums1.length;i++){ if(obj[nums1[i]]){ obj[nums1[i]] = obj[nums1[i]]+1 }else{ obj[nums1[i]] = 1; } } for(var j=0;j<nums2.length;j++){ if(obj[nums2[j]]) { arr.push(nums2[j]); obj[nums2[j]] = obj[nums2[j]]-1; } } return arr; };
方法三 对象
/** * @param {number[]} nums1 * @param {number[]} nums2 * @return {number[]} */ var intersect = function(nums1, nums2) { var arr = []; nums1.forEach(item=>{ let a = nums2.indexOf(item); if(a>-1){ arr.push(item) nums2[a] = null } }) return arr; };
进阶:blog