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+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

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

posted @ 2018-12-21 08:19  程序员小川  阅读(387)  评论(0编辑  收藏  举报