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);     
    }
}
扫描二维码关注公众号,回复: 236140 查看本文章

尝试理解一下思路:

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

  2.对两个数组进行排序

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

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

猜你喜欢

转载自www.cnblogs.com/beliveli/p/9015085.html
今日推荐