# 两个数组的交集(350)
# 题目
给定两个数组,编写一个函数来计算它们的交集。
# 举例
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2,2]
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [4,9]
# 算法
# Map
使用Map
存储第一个数组中数字出现的次数,然后在第二个数组中匹配Map
中对应的key,一旦匹配成功,将对应的value--
,并将key
推入结果数组
function intersect(nums1, nums2) {
let map = {}
let res = []
for(let i = 0; i < nums1.length; i++) {
if(!map[nums1[i]]) {
map[nums1[i]] = 1
} else {
map[nums1[i]]++
}
}
for(let i = 0; i < nums2.length; i++) {
if(map[nums2[i]]) {
res.push(nums2[i])
map[nums2[i]]--
}
}
return res
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 双指针
两个数组都是由小至大递增,使用指针滑动判断当前两数组元素大小,如不同,则指向小值的指针滑动;若相同,则同时滑动并将值推入结果数组
function intersect(nums1, nums2) {
nums1.sort((a, b) => a - b)
nums2.sort((a, b) => a - b)
let res = []
let i = 0, j = 0
while(i < nums1.length && j < nums2.length) {
if(nums1[i] < nums2[j]) {
i++
} else if (nums1[i] > nums2[j]) {
j++
} else {
res.push(nums1[i])
i++
j++
}
}
return res
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18