题纲
给定两个数组,编写一个函数来计算它们的交集。
示例 :
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出: [4,9]
说明:
- 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
- 我们可以不考虑输出结果的顺序。
方法1:
这种方法原则上比较暴力对所有的数都进行了一次遍历比较,同时清空了对比数组中当前对比相同的值,以防重复检测/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersect = function(nums1, nums2) {
var arr = [];
for(var i=0;i<nums1.length;i++){
for(var j=0;j<nums2.length;j++){
if(nums1[i] === nums2[j]) {
arr.push(nums1[i])
nums2[j]=null;
break;
}
}
}
return arr;
};
方法二:
这个方法是在做完方法一以后想到的优化方法 方法一在两个对比数组基数大了以后需要循环的次数成指数上升, 方法二 则使用一个对象作为中间存储变量,将其中一个作为参照的数组映射入对象中, 以数组的值为KEY,对象值是这个映射进去的数组key在数组中出现的次数, 再循环对比数组去取obj中是否有这个key有则说明相同,将该key的值减一,以此类推/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersect = function(nums1, nums2) {
var arr = [],
obj = {};
for(var i=0;i<nums1.length;i++){
if(obj[nums1[i]]){
obj[nums1[i]] = obj[nums1[i]]+1
}else{
obj[nums1[i]] = 1;
}
}
for(var j=0;j<nums2.length;j++){
if(obj[nums2[j]]) {
arr.push(nums2[j]);
obj[nums2[j]] = obj[nums2[j]]-1;
}
}
return arr;
};
方法三
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersect = function(nums1, nums2) {
var arr = [];
nums1.forEach(item=>{
let a = nums2.indexOf(item);
if(a>-1){
arr.push(item)
nums2[a] = null
}
})
return arr;
};
进阶:
- 如果给定的数组已经排好序呢?你将如何优化你的算法?
- 如果 nums1 的大小比 nums2 小很多,哪种方法更优?
- 如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
来源:https://www.cnblogs.com/jjq-exchange/p/11124508.html