【JS】两个数组的交集 II #排序 #哈希 #双指针 #二分查找

给定两个数组,编写一个函数来计算它们的交集。

示例 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

猜你喜欢

转载自blog.csdn.net/sphinx1122/article/details/84293554