题目描述
就是给两个数组,求出他们的交集。
说明:
- 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
- 我们可以不考虑输出结果的顺序。
思路
- 使用map 记录其中一个数组数值出现的次数。
- 遍历另一个数组,判断当前数字是否在map中,是的话添加到结果集中,并且当前map[number] 的值减1, 不是的话,那代表不是交集
var intersect = function(nums1, nums2) {
let result = [];
let map = new Map();
for(let i = 0; i < nums1.length; i++) {
if(map.has(nums1[i])) {
map.set(nums1[i], map.get(nums1[i]) + 1)
} else {
map.set(nums1[i], 1)
}
}
for(let j = 0; j < nums2.length; j++ ) {
// 判断当前数字是否在map 中,并且当前map的值是否大于0, 大于0的意思是:map 中还有 没有取交集的数
if(map.has(nums2[j]) && map.get(nums2[j]) > 0 ) {
result.push(nums2[j]);
map.set(nums2[j], map.get(nums2[j]) - 1)
}
}
return result;
};
进阶
- 如果给定的数组已经排好序呢?你将如何优化你的算法?
- 如果 nums1 的大小比 nums2 小很多,哪种方法更优?
- 如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
这里只给一个想法吧,既然数组已经排序好了, 那我们就使用双指针的方法去解决这个问题,一个数组一个指针,如果两个指针所指的数相等,那么两个指针向后移,不相等的话判断哪个数值比较大,小的那个向后移,如此类推