题目描述
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
说明:
输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。
解答
首先对nums1进行遍历,将遍历结果存储在map中,然后针对nums2进行遍历,如果nums2中的元素在map中出现了,就存储下来,即可或得两个数组的交集。
function intersection(nums1, nums2) {
const map = new Map()
// 对nums1进行遍历存储在map中,通过map进行查找的速度会快很多
for (const num of nums1) {
map.set(num, true)
}
let k = 0;
for (const num of nums2) {
const value = map.get(num)
if (value) {
nums2[k] = num
k++
map.set(num, false)
}
}
return nums2.slice(0, k)
}
变型
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]
说明:
输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。我们可以不考虑输出结果的顺序。
变型解答
此题和上一题非常相似,不同之处在于重复的数据需要重复展示,这样我们在存储map的时候就不能简单的true表示,需要进行计数,其余步骤相同。
function intersection(nums1, nums2) {
const map = new Map()
for (const num of nums1) {
const value = map.get(num) || 0
map.set(num, value + 1)
}
let k = 0;
for (const num of nums2) {
const value = map.get(num)
if (value > 0) {
nums2[k] = num
k++
map.set(num, value - 1)
}
}
return nums2.slice(0, k)
}
进阶
给定两个有序数组,编写一个函数来计算它们的交集。
示例:
输入: 排序数组 nums1 = [1,2,3,4,5], nums2 = [3,4,6,7]
输出: [3,4]
进阶解答
此题我们可以通过双指针来解,不断的移动index1和index2,进行对应元素的比较
function intersection(nums1, nums2) {
let index1 = 0
let index2 = 0
const intersection = []
while(index1 < nums1.length && index2 < nums2.length) {
if (nums1[index1] === nums2[index2]) {
// 当两者相等的时候,intersection中为空的时候直接塞进去,或者当元素和最后一个元素不相等的时候塞进去
if (!intersection.length || nums1[index1] !== intersection[intersection.length - 1]) {
intersection.push(nums1[index1])
index1++
index2++
}
} else if (nums1[index1] > nums2[index2]) {
// 当nums1[index1] > nums2[index2]的时候,index2++
index2++
} else {
index1++
}
}
return intersection
}