349.两个数组的交集
题目
LeetCode 简单
题目
给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
示例:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的
题解
方法:Set
Set
O(m+n) O(m+n)
ts
function intersection(nums1: number[], nums2: number[]): number[] {
let resSet: Set<number> = new Set(),
nums1Set: Set<number> = new Set(nums1)
for (let i of nums2) {
if (nums1Set.has(i)) {
resSet.add(i)
}
}
return Array.from(resSet)
//简化
// return [...new Set(nums1.filter(item => nums2.includes(item)))]
}
const nums1 = [4, 9, 5]
const nums2 = [9, 4, 9, 8, 4]
console.log('🌰', intersection(nums1, nums2))
方法:排序 + 双指针
排序 + 双指针
O(mlogm+nlogn) O(logm+logn)
ts
function intersectionUseTwoPointers(
nums1: number[],
nums2: number[],
): number[] {
nums1.sort((a, b) => a - b)
nums2.sort((a, b) => a - b)
let i1 = 0,
i2 = 0,
result = []
while (i1 < nums1.length && i2 < nums2.length) {
if (nums1[i1] === nums2[i2]) {
if (result.indexOf(nums1[i1]) === -1) {
result.push(nums1[i1])
}
i1++
i2++
}
if (nums1[i1] < nums2[i2]) {
i1++
}
if (nums1[i1] > nums2[i2]) {
i2++
}
}
return result
}
console.log('🌰', intersectionUseTwoPointers(nums1, nums2))