描述
给定两个数组,编写一个函数来计算它们的交集,不要求顺序
示例 1:
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2,2]
示例 2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [4,9]
说明:
- 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
- 我们可以不考虑输出结果的顺序。
进阶: - 如果给定的数组已经排好序呢?你将如何优化你的算法?
- 如果 nums1 的大小比 nums2 小很多,哪种方法更优?
- 如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
解题思路
一 ,数组排序,然后累加判断
- 将数组排序是为了更加有效地进行判断交集元素,因为如果最小元素都无法开始匹配,意味着两个数组中不会有交集,同时也是为了进一步的进行匹配。
- 在进行交集判断时,用到了两个累加的数组,当不符合相等也就是交集时,累加一方的元素;当存在交集时,两方同时计数+1,继续寻找相同的元素。
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersect = function(nums1, nums2) {
let len1= nums1.length
let len2 = nums2.length
let newArr = []
if(!nums1 || !nums2 || len1 === 0 || len2 === 0){
return newArr
}
nums1.sort((a,b) =>{
return a- b
})
nums2.sort((a,b) =>{
return a- b
})
let i = 0
let j = 0
while(i<len1 || j<len2){
if(nums1[i]<nums2[j]){
i++
}else if(nums1[i]>nums2[j]){
j++
} else {
if(nums1[i] === nums2[j]){
newArr.push(nums1[i])
}
if(i<len1-1){
i++
}else{
break
}
if(j<len2-1){
j++
}else{
break
}
}
}
return newArr
};