zoukankan      html  css  js  c++  java
  • LeetCode算法题-Intersection of Two Arrays II(Java实现)

    这是悦乐书的第208次更新,第220篇原创

    01 看题和准备

    今天介绍的是LeetCode算法题中Easy级别的第76题(顺位题号是350)。给定两个数组,编写一个函数来计算它们的交集。例如:

    输入:nums1 = [1,2,2,1],nums2 = [2,2]
    输出:[2,2]

    输入:nums1 = [4,9,5],nums2 = [9,4,9,8,4]
    输出:[4,9]

    注意

    • 结果中的每个元素应该出现在两个数组中显示的次数。

    • 结果可以是任何顺序。

    跟进

    • 如果给定的数组已经排序怎么办? 你会如何优化你的算法?

    • 如果nums1的尺寸与nums2的尺寸相比较小怎么办? 哪种算法更好?

    • 如果nums2的元素存储在磁盘上,并且内存有限,以致您无法一次将所有元素加载到内存中,该怎么办?

    02 第一种解法

    今天这题是昨天题目的升级版,唯一的区别就是最后输出的结果数组中,元素并不唯一。对此,只需要将昨天的HashSet换成ArrayList即可,双指针的思路还是一样。

    先将两数组排序,然后使用双指针,依次判断两数组中的元素是否相等,如果某个元素大于或小于另外一个元素,则将指针向后移动,如果相等,则将元素放入ArrayList中,然后将ArrayList中的元素迭代放入数组,最后返回。

    因为使用Arrays类的sort方法,所以时间复杂度是O(n log(n)),空间复杂度是O(n)

    public int[] intersect(int[] nums1, int[] nums2) {
        List<Integer> list = new ArrayList<Integer>();
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        int i = 0;
        int j = 0;
        while (i < nums1.length && j < nums2.length) {
            if (nums1[i] < nums2[j]) {
                i++;
            } else if (nums1[i] > nums2[j]) {
                j++;
            } else {
                list.add(nums1[i]);
                i++;
                j++;
            }
        }
        int[] result = new int[list.size()];
        int k = 0;
        for (Integer num : list) {
            result[k++] = num;
        }
        return result;
    }
    

    03 第二种解法

    利用HashMap,先将其中一个数组的元素全部存入其中,key为元素值,value为该元素出现次数。然后遍历第二个数组,如果map中存在当前元素,并且在map中此元素所对应的value值大于0,就将其添加进ArrayList中,同时对该元素在map中所对应的value值减1,避免重复判断。

    此解法因为用到了HashMap的contains方法,因此时间复杂度最好情况是O(n),最坏情况是O(n^2),空间复杂度是O(n)

    public int[] intersect2(int[] nums1, int[] nums2) {
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        for (int num : nums1) {
            map.put(num, map.getOrDefault(num, 0) + 1);
        }
        List<Integer> result = new ArrayList<Integer>();
        for (int num : nums2) {
            if (map.containsKey(num) && map.get(num) > 0) {
                result.add(num);
                map.put(num, map.get(num) - 1);
            }
        }
        int[] arr = new int[result.size()];
        for (int i = 0; i < result.size(); i++) {
            arr[i] = result.get(i);
        }
        return arr;
    }
    

    04 小结

    对于第一点跟进,第一种解法就可以解决。第二点跟进,可以在第二种解法那里优化下,将长度较小的数组存入HashMap,然后迭代长度较大的数组来和HashMap中的元素比较。第三点跟进没思路,如果大家对于第三点跟进有什么想法或思路,欢迎下方留言交流讨论。

    算法专题目前已连续日更超过两个月,算法题文章76+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

    以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

  • 相关阅读:
    iOS 列表三级展开
    iOS 聊天界面
    iOS 地图(添加大头针)
    iOS 地图
    swift 快速创建一些基本控件
    swift
    swift
    swift4.2 打印所有系统字体
    Xcode 去掉控制台无用打印信息
    swift
  • 原文地址:https://www.cnblogs.com/xiaochuan94/p/10153627.html
Copyright © 2011-2022 走看看