前言
349题和350题思路类似,都是利用Hash,所以放在了一起解析。
349.两个数组的交集
原题
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2]
示例 2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [9,4]
说明:
- 输出结果中的每个元素一定是唯一的。
- 我们可以不考虑输出结果的顺序。
思路
我们首先循环nums1数组,使用nums1数组中的每一个子项,作为key,value设置为true,构建hash表。
接着我们循环nums2数组,使用hash表对nums2中的每一个子项查询。如果nums2的子项存在于hash表中,说明子项与nums1存在交集,将子项push进结果数组即可。接着我们将hash表中对应的value设置为false,避免重复的元素push进结果数组中。
代码
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersection = function(nums1, nums2) {
let hashMap = {}
let result = []
for (let i = 0; i < nums1.length; i++) {
if (!hashMap[nums1[i]]) {
hashMap[nums1[i]] = true
}
}
for (let i = 0; i < nums2.length; i++) {
if (hashMap[nums2[i]]) {
result.push(nums2[i])
hashMap[nums2[i]] = false
}
}
return result
};
350.两个数组的交集 II
原题
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2,2]
示例 2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [4,9]
说明:
- 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
- 我们可以不考虑输出结果的顺序。
思路
思路同349题类似,不同是我们需要在hash表中记录每一个元素出现的次数。
当我们循环nums2时,每次nums2与nums1产生交集时,我们将hash表中记录自减一,当hash表的某一项减至0时,说明nums1不会与nums2产生重复的交集了,我们就无需再将重复的子项push进结果数组中了。
代码
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersect = function(nums1, nums2) {
let hashMap = {}
let result = []
for (let i = 0; i < nums1.length; i++) {
if (!hashMap[nums1[i]]) {
hashMap[nums1[i]] = 1
} else {
hashMap[nums1[i]] += 1
}
}
for (let i = 0; i < nums2.length; i++) {
if (hashMap[nums2[i]]) {
result.push(nums2[i])
hashMap[nums2[i]] -= 1
}
}
return result
};