• [Algorithm] 350. Intersection of Two Arrays II


    Given two arrays, write a function to compute their intersection.

    Example 1:

    Input: nums1 = [1,2,2,1], nums2 = [2,2]
    Output: [2,2]
    

    Example 2:

    Input: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
    Output: [4,9]

    Note:

    • Each element in the result should appear as many times as it shows in both arrays.
    • The result can be in any order.

    Not good enough approach

    var intersect = function(nums1, nums2) {
        let r = [];
        // get larger array
        const len1 = nums1.length;
        const len2 = nums2.length;
        
        // larger & smaller
        const larger = len1 > len2 ? nums1: nums2;
        const smaller = len1 > len2 ? nums2: nums1;
        
        // conver larger array to object
        let hashed = {};
        for (let n of larger) {
            if (n in hashed) {
                hashed[n]++;
            } else {
                hashed[n] = 1;
            }
        }
     
        // loop over smaller array
        for (let n of smaller) {
            if (`${n}` in hashed) {
                r.push(n);
                hashed[n] = hashed[n]-1;
                if (hashed[n] === 0) {
                    delete hashed[n];
                }
            }
        }
        
        return r;
    };

    The reason that code above is not good enough is because,

    1. we use larger array as lookup, this cause more memory usage. -- actually we need to use smaller array as lookup

    2. we use 'len1, len2, samller, larger' extra storage, we can actully swap nums1 and nums by one extra function call.

    var intersect = function(nums1, nums2) {
    
        if (nums1.length > nums2.length) {
            return intersect(nums2, nums1);
        }
        
        // conver samller array to object
        let hashed = {};
        for (let n of nums2) {
            if (n in hashed) {
                hashed[n]++;
            } else {
                hashed[n] = 1;
            }
        }
        
        let r = [];
        // loop over smaller array
        for (let n of nums1) {
            if (hashed[n] > 0) {
                r.push(n);
                hashed[n] = hashed[n]-1;
            }
        }
        
        return r;
    }

    Follow up:

    • What if the given array is already sorted? How would you optimize your algorithm?
    • What if nums1's size is small compared to nums2's size? Which algorithm is better?
    • What if elements of nums2 are stored on disk, and the memory is limited such that you cannot load all elements into the memory at once?

    Will write another post for the follow up questions.

  • 相关阅读:
    ajax提交 返回中文乱码问题
    JAVA spring配置文件总结
    缓存线程池的作用
    myclipse里有感叹号的问题,希望可以帮到各位
    html 鼠标样式 鼠标悬停 小手样式
    在div中注入html代码
    发送邮件的几种方法(C#发邮件 和 js前台实现都有)C#后台自动发邮件 js发邮件
    Angular js 复制粘贴
    C# ASP 面试题 2017
    cocos-lua3.17 cocos studio lua动画使用
  • 原文地址:https://www.cnblogs.com/Answer1215/p/12040497.html
Copyright © 2020-2023  润新知