L349. L350两个数组的交集
- 两个数组的交集
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2]
示例 2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [9,4]
说明:
输出结果中的每个元素一定是唯一的。(这个就表示不允许重复)
我们可以不考虑输出结果的顺序。
class Solution {public int[] intersection(int[] nums1, int[] nums2) {int len1 = nums1.length, len2 = nums2.length;HashSet<Integer> set = new HashSet<>();HashSet<Integer> s2 = new HashSet<>();for(int i = 0; i < len1; i++){set.add(nums1[i]);}for(int i = 0; i < len2; i++){if(set.contains(nums2[i])){s2.add(nums2[i]);}}int[] res = new int[s2.size()];int i= 0;for(int nn: s2){res[i++] = nn;}return res;}
}
2.利用内置函数
class Solution {public int[] intersection(int[] nums1, int[] nums2) {int len1 = nums1.length, len2 = nums2.length;HashSet<Integer> set = new HashSet<>();HashSet<Integer> s2 = new HashSet<>();for(int i = 0; i < len1; i++){set.add(nums1[i]);}for(int i = 0; i < len2; i++){s2.add(nums2[i]);}//利用内置函数set.retainAll(s2);int[] res = new int[set.size()];int i= 0;for(int nn: set){res[i++] = nn;}return res;}
}
L350
- 两个数组的交集 II
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2,2]
示例 2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [4,9]
说明:
输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
我们可以不考虑输出结果的顺序。
进阶:
如果给定的数组已经排好序呢?你将如何优化你的算法?
如果 nums1 的大小比 nums2 小很多,哪种方法更优?
如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
1使用hashmap计算次数、
class Solution {public int[] intersect(int[] nums1, int[] nums2) {int len1 = nums1.length, len2 = nums2.length;if(len1 > len2) return intersect(nums2, nums1);//直接交换就可以了HashMap<Integer, Integer> map = new HashMap<>();//改用hashMap,记录元素的个数//这里最终的结果允许出现重复的for(int nn :nums1){map.put(nn ,map.getOrDefault(nn, 0) + 1);}int k = 0;int [] ans = new int[len1];//现在大小不确定,但是可以使用函数for(int nn: nums2){int cnt = map.getOrDefault(nn, 0);//注意不能直接使用getif(cnt > 0){ans[k++] = nn;map.put(nn, map.get(nn) - 1);//每取一次,就-1}}return Arrays.copyOfRange(ans, 0, k);}}
当输入数据是有序的,推荐使用此方法。在这里,我们对两个数组进行排序,并且使用两个指针在一次扫面找出公共的数字。
class Solution {public int[] intersect(int[] nums1, int[] nums2) {int len1 = nums1.length, len2 = nums2.length;//先排序Arrays.sort(nums1);Arrays.sort(nums2);int i = 0, j = 0, k = 0;int ans[] = new int[len1];while(i < len1 && j < len2){//只要有一个到结尾就停下来if(nums1[i] < nums2[j]){i++;}else if(nums1[i] > nums2[j]){j++;}else {//如果相同ans[k++] = nums1[i++];j++;}}return Arrays.copyOfRange(ans, 0, k);}}
解法三:通过归并外排将两个数组排序后再使用排序双指针查找
对应进阶问题三,如果内存十分小,不足以将数组全部载入内存,那么必然也不能使用哈希这类费空间的算法,只能选用空间复杂度最小的算法,即解法一。
但是解法一中需要改造,一般说排序算法都是针对于内部排序,一旦涉及到跟磁盘打交道(外部排序),则需要特殊的考虑。归并排序是天然适合外部排序的算法,可以将分割后的子数组写到单个文件中,归并时将小文件合并为更大的文件。当两个数组均排序完成生成两个大文件后,即可使用双指针遍历两个文件,如此可以使空间复杂度最低。
L349. L350两个数组的交集相关推荐
- L350 两个数组的交集 ii leetcode
1. 一个错误的思路:用小的那个数组,逐个扫描大的数组,如果存在,就加入新Arraylist.但是,这个算法有个很严重的问题,没有考虑次数 比如: {3,1,2} {1,1} 这样输出的是{1,1}, ...
- 两个数组的交集 II
两个数组的交集 II 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2,2] 示例 2: 输入:nums1 ...
- 数组-两个数组的交集(两个集合)
题意: 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2] 示例 2: 输入:nums1 = [4,9,5] ...
- 9.LeetCode第350题---两个数组的交集2
一.目的 记录本题的主要目的是想让自己以及大家记住一个Java中的一个函数,可以去除数组中的后面无用的零 方法是Arrays.copyOfRange(res,0,index); 另外需要注意的是本题与 ...
- php 两个数组求交集_如何求两个数组的交集
题目描述 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2] 示例 2: 输入:nums1 = [4,9,5] ...
- Leetcode 350. 两个数组的交集 II 解题思路及C++实现
解题思路: 和349. 两个数组的交集 这道题目很相似,这道题只是在返回的数组中,多了重复的数字,其实相较于349题,350题更简单. 先对两个数组进行排序,然后遍历这两个数组,找到相同的数字之后,就 ...
- 350. Intersection of Two Arrays II 两个数组的交集 II
Title 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: nums1 = ...
- php两个数组找公共部分,PHP开发中如何查找两个数组的交集
在PHP中,可以使用内置函数array_intersect()来查找两个数组的交集,它可以返回两个数组的公共元素(相交部分).下面我们就来具体介绍一下. array_intersect()函数 基本语 ...
- leetcode初级算法4.两个数组的交集 II
leetcode初级算法4.两个数组的交集 II 仅为个人刷题记录,不提供解题思路 题解与收获 我的解法:(总结在代码中) public int[] intersect(int[] nums1, in ...
最新文章
- 代码对比工具,我就用这 6 个!
- 快速了解上市公司年报
- C++ share_prt 简单设计和实现
- Linux 命令之 eval -- 对参数执行两次解释
- 今天的我们班胜利了的飞鸽传书
- Python加权图的邻接表邻接矩阵之转换
- sql server 部署_将程序包部署到SQL Server集成服务目录(SSISDB)
- JSTL 学习、应用记录
- mysql 图文安装_mysql安装图解mysql图文安装教程(详细说明)
- [Java反序列化]AspectJWeaver反序列化
- matlab机器学习库
- 超级搜索(Super search)
- python爬取全国真实地址_python爬虫学习之爬取全国各省市县级城市邮政编码
- -XX:+PrintGCTimeStamps -XX:+PrintGCDetails 日志分析
- mix3android auto,小米MIX3滑盖全面屏值不值得买?三天真实体验说说优缺点
- 2020-10-18Go语言接口
- Docker 容器技术(史上最强总结)
- 基于SSM技术的医院在线预约诊疗系统设计与实现毕业设计源码011130
- 使用Remmina远程登录Ubuntu系统并实现文件共享(可实现类似Teamviewer功能)
- HTML5简介(补充. 浏览器私有前缀)
热门文章
- 【数组指针】 仅此一篇 让你深刻理解数组指针
- 江苏苏州|第七届“祖冲之杯”昆山创新创业大赛上海智能制造装备与技术选拔赛项目征集公告
- leaflet暗色系地图样式地图(滤镜实现,反色滤镜)(leaflet篇.10)
- QT传输函数控件设计10 包含小圆点的图形项
- 计薪日21.75和工作日20.83是如何算出来的,有什么区别
- 中国PPP管理库项目累计投资额13.2万亿元
- 内存管理(四)——虚拟内存
- CComboBox控件详解
- 基于 Laravel-Admin 在十分钟内搭建起功能齐全的后台模板
- 如何开发、本地测试、发布 Laravel 扩展包?Class ‘Angkee\Admin\AdminServiceProvider‘ not found