题目描述
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
1 2
| 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2]
|
示例 2:
1 2
| 输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出: [9,4]
|
说明:
1 2
| 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。
|
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/intersection-of-two-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
标签 排序 哈希表 双指针 二分查找
解法一 哈希表
时间复杂度:O(m+n)
利用哈希集合值唯一的特性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
var intersection = function(nums1, nums2) { let hash1 = new Set(nums1) let hash2 = new Set()
for(let i = 0; i < nums2.length; i++) { if(hash1.has(nums2[i])){ hash2.add(nums2[i]) } } return [...hash2] };
|
解法二 双指针,排序
因为标签里有双指针和排序就尝试了下。
执行时间会很长,排序后把数组先去重会好一点。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
var intersection = function(nums1, nums2) { nums1 = nums1.sort((a,b) => a - b) nums2 = nums2.sort((a,b) => a - b) let p1 = p2 = 0 let res = new Set() while(p1 < nums1.length && p2 < nums2.length) { if(nums1[p1] < nums2[p2]) { p1++ } else if(nums1[p1] == nums2[p2]){ res.add(nums1[p1]) p1++ p2++ } else { p2++ } } return [...res] };
|
解法三: 数组api
1 2 3 4 5 6 7 8
|
var intersection = function(nums1, nums2) { return [...new Set(nums1.filter(v => nums2.includes(v)))] };
|