给定两个数组,编写一个函数来计算它们的交集。
示例 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 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
解法一:
使用indexOf()的查找功能,
遍历nums1,用遍历出的每个元素对比nums2,
当找不到相同的,就删除nums1的元素,若找到相同的,就删除nums2对应的元素,
返回nums1
2018/11/20 Mon
var intersect = function(nums1, nums2) {
for(var i=0;i<nums1.length;i++){
var pos = nums2.indexOf(nums1[i]);
if(pos>-1) nums2.splice(pos,1)
if(pos==-1){
nums1.splice(i,1)
i--
}
}
return nums1;
}
61 / 61 个通过测试用例
执行用时:84 ms
or
也可以把相同的元素存入一个新的数组
var intersect = function(nums1, nums2) {
var pos,arr=[]
for(var i=0;i<nums1.length;i++){
pos = nums2.indexOf(nums1[i]);
if(pos>-1){
nums2.splice(pos,1);
arr.push(nums1[i])
}
}
return arr;
}
解法二:
-如果给定的数组已经排好序呢?你将如何优化你的算法?
-如果 nums1 的大小比 nums2 小很多,哪种方法更优?
遍历nums1,利用二分查找nums2,相等的元素写入新数组
var intersect = function(nums1, nums2) {
nums1=nums1.sort(sortName)
nums2=nums2.sort(sortName)
var arr=[]
for(var i=0;i<nums1.length;i++){
var lo=0,hi=nums2.length-1,mid
while(lo<=hi){
mid=Math.ceil((lo+hi)/2)
if(nums2[mid]==nums1[i]) {
arr.push(nums1[i])
nums2.splice(mid,1)
break;
}else if(nums2[mid]>nums1[i]){
hi=mid-1
}else{
lo=mid+1
}
}
}
return arr;
};
var sortName=function(a,b){return a-b}
61 / 61 个通过测试用例
执行用时:100 ms