美文网首页
两个数组的交集 II

两个数组的交集 II

作者: fan_8209 | 来源:发表于2021-04-20 23:44 被阅读0次

    给定两个数组,编写一个函数来计算它们的交集。
    示例 1:
    输入:nums1 = [1,2,2,1], nums2 = [2,2]
    输出:[2,2]
    1、哈希方式
    // 思路:把nums1数组遍历到map集合里,记录每个元素出现的次数。
    // 然后遍历nums2元素是否在nums1的map集合里出现,若出现则将该元素放到newArr数组中,
    // nums1的map集合里次数减一(减至为0时删除这个元素)

    var intersect = function(nums1, nums2) {
        let map1 = new Map() //初始化一个map集合
        let newArr = [] //设置一个交集数组
        let long = nums1,short = nums2
        if(nums1.length<nums2.length){
            long = nums2
            short = nums1
        }//为了降低空间复杂度,首先遍历较短的数组并在哈希表中记录每个数字以及对应出现的次数,然后遍历较长的数组得到交集。
        for(let i=0;i<short.length;i++){
            if(map1.has(short[i])){//当map1集合中有该元素,元素数量加一
                map1.set(short[i],map1.get(short[i])+1)
            }else{
                map1.set(short[i],1)//当map1集合中无该元素,将该元素加入到map1中初始数量为1
            }
        }
        console.log(map1)
        for(let i=0;i<long.length;i++){//遍历另一个数组元素在map1中查找是否存在
            if(map1.has(long[i])){//当存在时
                if((map1.get(long[i]) - 1)==0){//如果此时map1中该元素数量减1,为0时
                    map1.delete(long[i]) //删除该元素
                }else{//如果此时map1中该元素数量减1,不为0
                    map1.set(long[i],map1.get(long[i]) - 1)//数量减1
                }
                newArr.push(long[i])//将该元素放到newArr数组
            }
        }
        console.log(newArr)
        return newArr
    };
    

    2、双指针
    // 双指针方式。两个数组先排序,然后设置两个指针分别指向两个数组,
    // 当指向的元素相同时,把该元素放到newArr中,len1,len2指针都后移一位
    // 当指向的元素不同时,len1值<len2值时,len1后移一位继续比较。反之,len2后移一位继续比较

    var intersect = function(nums1, nums2) {
        let newArr = [] //存放交集数字
        nums1.sort((a,b)=>a-b)
        nums2.sort((a,b)=>a-b) //排序便于比较
        console.log(nums1)
        let len1 = 0,len2 = 0 //设置两个指针
        while(len1<nums1.length&&len2<nums2.length){ //两个指针都在各自长度范围内
            if(nums1[len1]==nums2[len2]){ //当两个指针所指向的元素相同时
                newArr.push(nums1[len1]) //把该元素放入到交集数组newArr中
                len2++
                len1++ //两个指针都后移一位,继续循环进行下一次比较
            }else{
                nums1[len1]>nums2[len2]?len2++:len1++
                // 当指向的元素不同时,len1值<len2值时,len1后移一位继续比较。反之,len2后移一位继续比较
            }
        }
        console.log(newArr)
    };
    nums1 = [4,9,5], nums2 = [9,4,9,8,4]
    intersect(nums1, nums2)
    

    相关文章

      网友评论

          本文标题:两个数组的交集 II

          本文链接:https://www.haomeiwen.com/subject/ifvclltx.html