zoukankan      html  css  js  c++  java
  • 两个数组的交集

    此博客链接:

    两个数组的交集

    题目链接:

    题目

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

    示例 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 的元素存储在磁盘上,内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

    题解

    方法一:使用map

    先把一个数组的值添加到map中,记录数组中的元素值和对应个数,判断第二个数组中的元素是否在map中,如果在,则取出添加到结果集中,并把map中的value值减一,如果不在,则说明不是两者的交集。

    这里有个技巧:把数租少的元素生成键值对,用多的数组去找map中的值。

    方法二:使用双指针

    定义两个指针分别指向两个数组的头部,判断两个数组中指针所指的元素是否相等,如果相等,则移动双指针,并把元素添加到结果集中,如果那个小,则移动那个指针。

     

    代码

    方法一

    class Solution {
        public int[] intersect(int[] nums1, int[] nums2) {
           Map <Integer,Integer> map=new HashMap<Integer,Integer>();
           int len1=nums1.length;
           int len2=nums2.length;
           if(len2<len1){
               return intersect(nums2,nums1);
           }
           for(int nums:nums1 )
           {
               int count=map.getOrDefault(nums,0)+1;
               map.put(nums,count);
           }
           int res[]=new int[len1];
           int index=0;
           for(int nums02:nums2 )
           {
               int count=map.getOrDefault(nums02,0);
               if(count>0)
               {
                  res[index++]=nums02;
                  count--;
                  if(count>0)
                  {
                      map.put(nums02,count);
                  }
                  else{
                      map.remove(nums02);
                  }
               }
               
           }
           return Arrays.copyOfRange(res, 0, index);
        }
    }

     方法2

    class Solution {
        public int[] intersect(int[] nums1, int[] nums2) {
           int len1=nums1.length;
           int len2=nums2.length;
           if(len2<len1){
               return intersect(nums2,nums1);
           }
           Arrays.sort(nums1);
           Arrays.sort(nums2);
           int res[]=new int[len1];
           int index=0;
           int left=0;
           int right=0;
          while(left<len1&&right<len2)
           {
               if(nums1[left]<nums2[right])
               {
                   left++;
               }
               else if(nums1[left]>nums2[right])
               {
                   right++;
               }
               else{
                   res[index++]=nums1[left];
                   left++;
                    right++;
               }
           }
           return Arrays.copyOfRange(res, 0, index);
        }
    }

    结果

    方法一

    方法二

    出来混总是要还的
  • 相关阅读:
    vue项目锚点定位+滚动定位
    elementUI 弹出框添加可自定义拖拽和拉伸功能,并处理边界问题
    密码检验规则(字母数字和特殊字符组成的混合体)
    分布式版本控制系统git
    自动生成滚动条
    jq中append(),appendTo(),after(),before(),prepend(),prependTo()的用法
    清除浮动的几种方式
    王者荣耀周年福利活动绕过微信屏蔽
    看不懂源码?先来恶补一波Object原型吧
    Vue组件化开发
  • 原文地址:https://www.cnblogs.com/ping2yingshi/p/15097882.html
Copyright © 2011-2022 走看看