两个数组的交集 II

我与影子孤独终老i 提交于 2020-02-24 13:04:22

题纲 

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

示例 :

输入: 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 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!