zoukankan      html  css  js  c++  java
  • leetCode 两个数组的交集 II 问题记录

    问题如下:

    给定两个数组,写一个方法来计算它们的交集。
    
    例如:
    给定 nums1 = [1, 2, 2, 1], nums2 = [2, 2], 返回 [2, 2].
    
    注意:
    
       输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
       我们可以不考虑输出结果的顺序。
    跟进:
    
    如果给定的数组已经排好序呢?你将如何优化你的算法?
    如果 nums1 的大小比 nums2 小很多,哪种方法更优?
    如果nums2的元素存储在磁盘上,内存是有限的,你不能一次加载所有的元素到内存中,你该怎么办?

    自己的解法:

    class Solution {
        public int[] intersect(int[] nums1, int[] nums2) {
             HashMap<Integer,Integer> hashMap = new HashMap<>();
            ArrayList<Integer> result = new ArrayList<>();
    
            if (nums1.length > 0){
                for (int i =0;i<=nums1.length-1;i++){
                    Integer temp = hashMap.get(nums1[i]);
                    if (temp == null){
                        hashMap.put(nums1[i],1);
                    }else {
                        hashMap.put(nums1[i],temp+1);
                    }
                    
                }
                for(int j=0;j<=nums2.length-1;j++){
                    Integer temp = hashMap.get(nums2[j]);
    
                    if (temp != null){
                        result.add(nums2[j]);
    
                        if (temp> 1){
                            hashMap.put(nums2[j],temp-1);
                        }else {
                            hashMap.remove(nums2[j]);
                        }
                    }
                }
            }
    
            Integer[] integers = new Integer[result.size()];
            result.toArray(integers);
            int tmpInt[] = new int[result.size()];
    
            for (int i = 0; i < integers.length; i++) {
                tmpInt[i] = integers[i];
            }
    
            return tmpInt;
        }
    }

    思路: 1.先遍历数组1,将数组的每一项存入一个hashMap,如果一个元素出现多次则hashmap的value+1

              2.遍历数组2,判断当前元素在hashmap中是否存在,如果存在就将这个元素加入到result中

              3.判断当前元素的value,如果大于1则减1,否则将这个元素的key从hash中移除,

              4.最终得到的就是所求的两个数组重复的部分

    leet给的最优解

    class Solution {
        public int[] intersect(int[] nums1, int[] nums2) {
            int len1 = nums1.length;
            int len2 = nums2.length;
            int len = len1 > len2 ? len2 : len1;
    
            Arrays.sort(nums1);
            Arrays.sort(nums2);
    
            int[] nums = new int[len];
            int k = 0;
            int curr1, curr2 = 0;
            for(int i = 0, j = 0; i < len1 && j < len2;) {
                curr1 = nums1[i];
                curr2 = nums2[j];
                if(curr1 == curr2) {
                    nums[k] = curr1;
                    k += 1;
                    i += 1;
                    j += 1;
                } else if(curr1 < curr2) {
                    i += 1;
                } else {
                    j += 1;
                }
            }
    
            return Arrays.copyOfRange(nums, 0, k);     
        }
    }

    尝试理解一下思路:

      1.找到两个数组中相对较短的哪一个

      2.对两个数组进行排序

      3.从0开始遍历两个数组,判断当前遍历到的数组1和数组2元素是否相等,如果相等表示两个数组重复的部分开始,将这个元素放在返回数组中指示标志k所在的位置然后k+1

      4.遍历玩两个数组后对返回数组进行截取,得到重复部分的数组

  • 相关阅读:
    bzoj1593[Usaco2008 Feb]Hotel旅馆
    spoj1182 Sorted bit squence/[USACO2003 Dec]Cow Queueing
    [USACO2003 Dec]Cow Queueing数数的梦 (基础水数位DP带注释!)
    后缀数组模版+注释
    bzoj1690/poj3621[Usaco2007 Dec]奶牛的旅行
    bzoj1731/poj3169[Usaco2005 dec]Layout 排队布局
    bzoj2467[中山市选2010]生成树
    bzoj1594[Usaco2008 Jan]Haybale Guessing猜数游戏
    poj 1035 -- Spell checker
    poj 1611 -- The Suspects
  • 原文地址:https://www.cnblogs.com/beliveli/p/9015085.html
Copyright © 2011-2022 走看看