两个数组的交集 II [ LeetCode - 350 ]
例如:
给定 nums1 = [1, 2, 2, 1], nums2 = [2, 2], 返回 [2, 2].
注意:
- 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
- 我们可以不考虑输出结果的顺序。
跟进:
- 如果给定的数组已经排好序呢?你将如何优化你的算法?
- 如果 nums1 的大小比 nums2 小很多,哪种方法更优?
- 如果nums2的元素存储在磁盘上,内存是有限的,你不能一次加载所有的元素到内存中,你该怎么办?
以上是原题
public int[] intersect(int[] nums1, int[] nums2) {
Map<Integer, Integer> counter = new HashMap<>(); //计数器,key为数组中的数字,value为该数字在数组中出现的次数
for (int i = 0; i < nums1.length; i++) {
int num = nums1[i];
if (counter.containsKey(num)) {
counter.put(num, counter.get(num) + 1);
} else {
counter.put(num, 1);
}
}
List<Integer> tempList = new ArrayList<>();
for (int i = 0; i < nums2.length; i++) {
int num = nums2[i];
if (counter.containsKey(num) && counter.get(num) > 0) {
counter.put(num, counter.get(num) - 1); //计数器中记录该数字的次数减1
tempList.add(num); //将该数字添加到list中
}
}
int[] result = new int[tempList.size()];
//为满足题目返回值类型,将list转换为int数组
for (int i = 0; i < result.length; i++) {
result[i] = tempList.get(i);
}
return result;
}
OK,基本功能已经实现,下一步我们一起思考如何满足几个跟进问题:
- 如果给定的数组已经排好序呢?你将如何优化你的算法?
思路:因为两个数组都是有序的,那我们完全可以用两个指针c1和c2分别顺序扫描两个数组,得到两个数字m和n,有以下三种关系:
1、m == n,则该数字是重复数字,将该数字添加到结果数组中,同时将两个指针分别后移一位。
2、m > n,我们需要将c2指针后移一位。
3、m < n,我们需要将c1指针后移一位。
重复以上步骤,直到c1或c2其中一个指针已移动到数组末端。
代码实现如下:
public int[] intersect(int[] nums1, int[] nums2) {
int cur1 = 0, cur2 = 0; // 定义指针,指向数组开始位置
List<Integer> list = new ArrayList<>();
while (cur1 < nums1.length && cur2 < nums2.length) { // 循环结束条件:任何一个指针指向对应数组的末端
int num1 = nums1[cur1];
int num2 = nums2[cur2];
if (num1 == num2) { // 重复数字,加入结果列表中
list.add(num1);
cur1++;
cur2++;
} else if (num1 < num2) { // 将cur1指针后移一位,继续下一次比较
cur1++;
} else { // 将cur2指针后移一位,继续下一次比较
cur2++;
}
}
int[] result = new int[list.size()];
// 为满足题目返回值类型,将list转换为int数组
for (int i = 0; i < list.size(); i++) {
result[i] = list.get(i);
}
return result;
}
- 如果 nums1 的大小比 nums2 小很多,哪种方法更优?
- 如果nums2的元素存储在磁盘上,内存是有限的,你不能一次加载所有的元素到内存中,你该怎么办?
如果nums2的元素多到无法一次性加载到内存中,那我们应该:
1、将nums1中的数字初始化计数器。
2、使用缓冲流读取文件的一部分数据,计数器中有记录且记录的次数大于1,将该数字新增到结果数组中,计数器中该数字记录的次数减1,这样完成了这一部分数据的统计。
3、接着再读取文件中下一部分数据,重复步骤2。
OK,以上是这个问题的一些想法,如果朋友们有更好的方式,欢迎留言交流哈~
两个数组的交集 II [ LeetCode - 350 ]的更多相关文章
- 【Leetcode】【简单】【350. 两个数组的交集 II】【JavaScript】
题目描述 350. 两个数组的交集 II 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2]输出: [2,2] 示例 2 ...
- 前端与算法 leetcode 350. 两个数组的交集 II
目录 # 前端与算法 leetcode 350. 两个数组的交集 II 题目描述 概要 提示 解析 解法一:哈希表 解法二:双指针 解法三:暴力法 算法 # 前端与算法 leetcode 350. 两 ...
- Java实现 LeetCode 350 两个数组的交集 II(二)
350. 两个数组的交集 II 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入 ...
- LeetCode初级算法之数组:350 两个数组的交集 II
两个数组的交集 II 题目地址:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii/ 给定两个数组,编写一个函数来计算它们的交 ...
- 6、两个数组的交集 II
6.两个数组的交集 II 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: n ...
- leecode刷题(6)-- 两个数组的交集II
leecode刷题(6)-- 两个数组的交集II 两个数组的交集II 描述: 给定两个数组,编写一个函数来计算它们的交集. 示例: 输入: nums1 = [1,2,2,1], nums2 = [2, ...
- LeetCode 350: 两个数组的交集 II Intersection of Two Arrays II
题目: 给定两个数组,编写一个函数来计算它们的交集. Given two arrays, write a function to compute their intersection. 示例 1: 输 ...
- 350 Intersection of Two Arrays II 两个数组的交集 II
给定两个数组,写一个方法来计算它们的交集.例如:给定 nums1 = [1, 2, 2, 1], nums2 = [2, 2], 返回 [2, 2].注意: 输出结果中每个元素出现的次数, ...
- 【leetcode 简单】 第八十五题 两个数组的交集 II
给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: nums1 = [4,9,5 ...
随机推荐
- (数据科学学习手札29)KNN分类的原理详解&Python与R实现
一.简介 KNN(k-nearst neighbors,KNN)作为机器学习算法中的一种非常基本的算法,也正是因为其原理简单,被广泛应用于电影/音乐推荐等方面,即有些时候我们很难去建立确切的模型来描述 ...
- Entity Framework 数据生成选项DatabaseGenerated【转】
在EF中,我们建立数据模型的时候,可以给属性配置数据生成选项DatabaseGenerated,它后有三个枚举值:Identity.None和Computed. Identity:自增长 None:不 ...
- ORB-SLAM 代码笔记(五)Frame类
Frame类的成员变量主要包含从摄像头获取的图像的 1. 特征点信息(关键点+描述字) 2. 尺寸不变特征所用金字塔信息,这些都定义在ORBextractor对象中 3. 词袋模型参数,用于跟踪失败情 ...
- jq 一个强悍的json格式化查看工具
本文来自网易云社区 作者:娄超 在web 2.0时代json这种直观.灵活.高效数据格式基本已经成为一种标准格式,从各种web api,到配置文件,甚至现在连mysql都开始支持json作为数据类型. ...
- python 基础篇 04(列表 元组 常规操作)
本节主要内容:1. 列表2. 列表的增删改查3. 列表的嵌套4. 元组和元组嵌套5. range 一. 列表1.1 列表的介绍列表是python的基础数据类型之一 ,其他编程语言也有类似的数据类型. ...
- 九度OJ--Q1166
import java.text.DecimalFormat;import java.util.Scanner; /* * 题目描述: * 立方根的逼近迭代方程是 y(n+1) = y(n)*2/3 ...
- java线程(7)——阻塞队列BlockingQueue
回顾: 阻塞队列,英文名叫BlockingQueue.首先他是一种队列,联系之前Java基础--集合中介绍的Queue与Collection,我们就很容易开始今天的阻塞队列的学习了.来看一下他们的接口 ...
- PowerDesigner工具箱(palette)关了如何重新打开
PowerDesigner的设计工具箱palette,palette的实际意思:颜料.调色板 工具箱关闭了 重新打开的方法其实很简单的,贴几张图片上来,帮助一下大家 方法一: 在工具栏的空白处点击鼠标 ...
- 大数据分析中Redis应用
大数据分析中Redis 大数据时代,海量数据分析就像吃饭一样,成为了我们每天的工作.为了更好的为公司提供运营决策,各种抖机灵甚至异想天开的想法都会紧跟着接踵而来!业务多变,决定了必须每天修改系统,重新 ...
- 【题解】ZJOI2013蚂蚁寻路
这题强呀……打了10+30暴力之后苦想1h并不会做……于是去看题解.看题解的时候又莫名各种看错,结果看了好久才懂……记录一下血泪史吧. 这题不难发现走出来的图形就是一个高低高低的城堡型图案,命名为高峰 ...