难度:简单
题目描述:
给定两个数组,编写一个函数来计算它们的交集。
示例:
输入: nums1 = [1,2,2,1], nums2 = [2,2]输出: [2,2]
解题思路:
暴力解法,遍历短数组,查询元素在长数组中index值,如果存在则找到交集,并从长数组中删除该元素
var intersect = function(nums1, nums2) {let short = []let lang = []let x = []if(nums1.length > nums2.length) {short=nums2lang = nums1} else {short=nums1lang = nums2}for(let i = 0; i< short.length; i++){let index = lang.indexOf(short[i])if(index !== -1){lang.splice(index, 1)x.push(short[i])}}return x;};
哈希表
先用Hashmap记录第一个数组中的元素【放在key】,和出现的次数【放在value】。
然后再遍历第二个数组,如果找到对应元素,则添加这个元素到返回数组里。
如果value值大于1,HashMap中的value值减 1,表示已经找到一个相同的了。
如果value值等于1,则删除该元素
var intersect = function(nums1, nums2) {let hash = new Map()let res = []for(let i = 0; i < nums1.length; i++) {if(hash.has(nums1[i])) {hash.set(nums1[i], hash.get(nums1[i]) + 1)} else {hash.set(nums1[i], 1)}}for(let i = 0; i < nums2.length; i++) {let temp = nums2[i]let hashKey = hash.get(temp)if(hash.has(temp)) {res.push(temp)if(hashKey > 1) {hash.set(temp, hashKey - 1)} else {hash.delete(temp)}}}return res};
- 两个数组排序
- 设定两个为0的指针,比较两个指针的元素是否相等
- 如果相等,元素push到返回值里,两个指针同时往前
- 如果不相等,元素小的指针往前
var intersect = function(nums1, nums2) {let p1 = 0let p2 = 0let res = []nums1 = nums1.sort((a, b) => a - b)nums2 = nums2.sort((a, b) => a - b)while(p1 < nums1.length && p2 < nums2.length) {if(nums1[p1] == nums2[p2]) {res.push(nums1[p1])p1++p2++} else if(nums1[p1] < nums2[p2]) {p1++} else {p2++}}return res};
