【LeetCode】350. 两个数组的交集 II

350. 两个数组的交集 II

知识点:哈希表; 双指针

题目描述

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

说明:

输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。
我们可以不考虑输出结果的顺序。

进阶:

如果给定的数组已经排好序呢?你将如何优化你的算法?
如果 nums1 的大小比 nums2 小很多,哪种方法更优?
如果 nums2 的元素存储在磁盘上,内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

示例
输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2,2] 输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[4,9]

解法一:哈希表

这道题和349题的区别就在于这是真的交集,包括已经重复的,所以就不能用set了。又是涉及到次数的,所以我们可以用哈希表来做:统计nums1并记录其出现的次数在哈希表中,遍历nums2,如果出现了那就加入list,并且其次数要-1;如果其次数 < 0,即使还是有也不加了。

class Solution { public int[] intersect(int[] nums1, int[] nums2) { Map<Integer, Integer> map = new HashMap<>(); List<Integer> list = new ArrayList<>(); for(Integer num : nums1){ map.put(num, map.getOrDefault(num, 0)+1); } for(Integer num : nums2){ if (map.getOrDefault(num, 0) > 0){ list.add(num); map.put(num,map.get(num)-1); } } int index = 0; int[] arr = new int[list.size()]; for(Integer m : list){ arr[index++] = m; } return arr; } }

时间复杂度:O(N+M);

解法二:排序+双指针

和349题一样,只不过不用判断了,只要两个一样就加入。先将两个数组排序,这样两个数组都是从小到大了,然后使用两个指针同时遍历这两个数组,如果两个指针指的元素相等就是交集加入list,如果两个指针指的值不等,则移动较小的元素,接着比较。直到有一个指针走到了头。其实就是维持了一个从小到大的顺序。这样方便比较

class Solution { public int[] intersect(int[] nums1, int[] nums2) { int index1 = 0, index2 = 0; int index = 0; Arrays.sort(nums1); Arrays.sort(nums2); List<Integer> list = new ArrayList<>(); while (index1 < nums1.length && index2 < nums2.length){ if (nums1[index1] == nums2[index2]){ list.add(nums1[index1]); index1++; index2++; }else if(nums1[index1] < nums2[index2]){ index1++; }else{ index2++; } } int[] arr = new int[list.size()]; for(Integer m : list){ arr[index++] = m; } return arr; } }

__EOF__

本文作者Curryxin
本文链接https://www.cnblogs.com/Curryxin/p/15054512.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Curryxin  阅读(43)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
Live2D
欢迎阅读『【LeetCode】350. 两个数组的交集 II』
点击右上角即可分享
微信分享提示