每日一练:LeeCode-350. 两个数组的交集 II【数组+哈希表】

2.两个数组的交集 II

给你两个整数数组 nums1nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。

示例 1:

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

示例 2:

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

提示:

  • 1 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 1000

进阶

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

思路

方法1:先对数组进行排序

这段 Java 代码实现了求两个数组的交集的函数 intersect。它通过先对两个数组进行排序,然后使用双指针的方法来找到两个数组的公共元素。

public int[] intersect(int[] nums1, int[] nums2) {// 先对两个数组进行排序Arrays.sort(nums1);Arrays.sort(nums2);int i = 0;int j = 0;List<Integer> list = new ArrayList<>();while (i < nums1.length && j < nums2.length) {if (nums1[i] < nums2[j]) {// 如果nums1[i]小于nums2[j],说明nums1[i]可能在nums2中不存在,将i指针右移i++;} else if (nums1[i] > nums2[j]) {// 如果nums1[i]大于nums2[j],说明nums2[j]可能在nums1中不存在,将j指针右移j++;} else {// 如果nums1[i]等于nums2[j],说明两者相等,是公共元素,加入到集合list中,并将i和j指针都右移list.add(nums1[i]);i++;j++;}}// 将list转化为数组int index = 0;int[] res = new int[list.size()];for (int k = 0; k < list.size(); k++) {res[index++] = list.get(k);}return res;
}

这个函数接受两个整型数组 nums1nums2 作为输入,并返回两个数组的交集。函数首先对两个数组进行排序,然后使用两个指针 ij 来遍历两个数组。

  • 如果 nums1[i] 小于 nums2[j],那么 nums1[i] 可能不在 nums2 中存在,将 i 指针向右移动;
  • 如果 nums1[i] 大于 nums2[j],那么 nums2[j] 可能不在 nums1 中存在,将 j 指针向右移动;
  • 如果 nums1[i] 等于 nums2[j],说明两者相等,是公共元素,将其加入到集合 list 中,并将 ij 指针都向右移动。

最后,将集合 list 转换为数组 res 并返回。

这段代码实现了寻找两个数组的交集,并且时间复杂度为 O(nlogn),其中 n 是两个数组中较小的长度。

方法2:使用map解决

还可以使用map来解决,具体操作如下

  • 遍历nums1中的所有元素,把它存放到map中,其中key就是nums1中的元素,value就是这个元素在数组nums1中出现的次数

  • 遍历nums2中的所有元素,查看map中是否包含nums2的元素,如果包含,就把当前值加入到集合list中,然后对应的value要减1

最后再把集合list转化为数组即可,代码如下

public int[] intersect(int[] nums1, int[] nums2) {HashMap<Integer, Integer> map = new HashMap<>();ArrayList<Integer> list = new ArrayList<>();// 先把数组 nums1 的所有元素都存放到 map 中,其中 key 是数组中的元素,value 是这个元素出现在数组中的次数for (int i = 0; i < nums1.length; i++) {map.put(nums1[i], map.getOrDefault(nums1[i], 0) + 1);}// 然后再遍历 nums2 数组,查看 map 中是否包含 nums2 的元素,如果包含,就把当前值加入到集合 list 中,然后再把对应的 value 值减 1for (int i = 0; i < nums2.length; i++) {if (map.getOrDefault(nums2[i], 0) > 0) {list.add(nums2[i]);map.put(nums2[i], map.get(nums2[i]) - 1);}}// 把集合 list 转化为数组int[] res = new int[list.size()];for (int i = 0; i < list.size(); i++) {res[i] = list.get(i);}return res;
}

这个函数接受两个整型数组 nums1nums2 作为输入,并返回两个数组的交集。函数首先创建了一个哈希表 map,用来统计数组 nums1 中每个元素的出现次数。

然后,遍历数组 nums2,对于每个元素,如果在哈希表 map 中存在且出现次数大于 0,则将其加入到列表 list 中,并将对应的出现次数减 1。

最后,将列表 list 转换为数组 res 并返回。

这段代码实现了求两个数组的交集,并且时间复杂度为 O(n),其中 n 是两个数组中较小的长度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/776363.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何安全地添加液氮到液氮罐中

液氮是一种极低温的液体&#xff0c;它在许多领域广泛应用&#xff0c;但在处理液氮时需谨慎小心。添加液氮到液氮罐中是一个常见的操作&#xff0c;需要遵循一些安全准则以确保操作人员的安全和设备的完整性。 选择合适的液氮容器 选用专业设计用于存储液氮的容器至关重要。…

UEDITOR WORD图片转存交互

1.下载示例&#xff1a; Word一键粘贴控件-示例-泽优软件 2.复制WordPaster插件目录 3.引入插件文件 注意&#xff1a;不要重复引入jquery&#xff0c;如果您的项目已经引入了jq&#xff0c;则不用再引入jq-1.4 4.在工具栏中增加插件按钮 6.初始化控件 注意&#xff1a; 1.如…

C#面:选择题:关于异常

关于异常&#xff0c;下列的说法中不正确的是 &#xff1a; A)用户可以根据需要抛出异常 B)在被调用方法可通过throw语句把异常传回给调用方法 C)用户可以自己定义异常 D)在C#中有的异常不能被捕获 答&#xff1a;D 说明&#xff1a; 在C#中&#xff0c;几乎所有的异常都可以…

专业文件翻译,笔译翻译公司推荐!

在全球化的大潮中&#xff0c;文件翻译已然成为了商业、法律、科技、文化等诸多领域的核心纽带。特别是在商业交往、合同签订、技术交流等方面&#xff0c;一份高质量的译文往往关乎着合作的成败。而在这其中&#xff0c;专业的文件翻译公司更是扮演着至关重要的角色。它们不仅…

MySQL添加数据的方式

针对MySQL添加数据&#xff0c;有以下几种常见方式&#xff1a; INSERT INTO <TABLE_NAME> VALUES 这是最基本的插入单行或多行数据的方式&#xff0c;用于批量插入数据&#xff0c;示例如下&#xff1a; INSERT INTO table_name (column1, column2, column3,...)VALUES…

抖音即时零售生鲜及鲜花绿植类商品争议处理细则

为了保护消抖音费者权益&#xff0c;规范商家经营行为&#xff0c;抖音于近日新增《【即时零售】生鲜及鲜花绿植类商品争议处理细则》。详情如下&#xff1a; 第一章 适用范围 1.1 本规则适用于平台即时零售商家和消费者之间关于生鲜及鲜花绿植类商品的争议处理。 1.2 生鲜及…

香港公司股权转让 香港公司变更 香港公司转让

一、香港公司股权转让流程&#xff1a; 1、确定股权转让方案和目标&#xff1a;在进行股权转让之前&#xff0c;需明确自己的目标&#xff0c;并设计一个合适的股权转让方案。 2、签订股权转让协议&#xff1a;股权转让协议是股权转让的法律文件&#xff0c;规定了双方的权利…

Android CMakeLists.txt不同渠道加载对应目录动态库

要在 Android JNI 开发中的 CMakeLists.txt 文件中根据不同渠道加载不同的动态库&#xff0c;可以通过在 build.gradle 中定义 productFlavors&#xff0c;并为每个 flavor 指定不同的 CMake 变量&#xff0c;然后在 CMakeLists.txt 中根据这些变量来加载对应的动态库。 首先&a…

vue实例的data属性,可以在哪些生命周期中获取到

Vue实例的data属性可以在beforeCreate、created和beforeMount生命周期中获取到。 在Vue实例的生命周期中&#xff0c;data属性在不同的阶段有着不同的可访问性&#xff1a; beforeCreate&#xff1a;在实例初始化之后&#xff0c;数据观测 (data observer) 和事件配置之前被调…

C语言例4-33:求调和级数中第多少项的值大于10

代码如下&#xff1a; //求调和级数中第多少项的值大于10 //调和级数的第n项为11/21/3...1/n #include<stdio.h> #define LIMIT 10 int main(void) {int n1;float sum0.0;for(;;) //死循环&#xff0c;或者while&#xff08;1&#xff09;{sumsum1.0/n;if(sum&g…

深度学习系列63:tts和智能语音助手

1. tts 使用sherpa的参考代码如下 import soundfile as sf import sherpa_onnx def write(text,output_filename,sid10,providercpu):tts_config sherpa_onnx.OfflineTtsConfig(modelsherpa_onnx.OfflineTtsModelConfig(vitssherpa_onnx.OfflineTtsVitsModelConfig(modelvit…

软件测试工作规范、流程规范

1. 制定规则 为了规范测试工作、减少开发与测试之前的沟通成本、保证项目进度、提高软件质量&#xff0c;测试组起草了这份软件测试工作规范。 1.1. 编码规范 软件程序开发需要遵守编码规范&#xff0c;一是可以减少代码的维护成本&#xff0c;提高开发工作效率&#xff1b;…

商标和品牌的区别是什么

商标和品牌是两个不同的概念&#xff1a; 商标是一个法律概念&#xff0c;指的是商家在市场竞争中使用的标识&#xff0c;可以是词、图形、数字、颜色、三维标记等。商标的主要作用是让消费者更容易地识别出产品或服务的来源&#xff0c;并保障商家的知识产权。 品牌则是一个…

【明道云】明道云主从表中计算列的即时重算问题

【背景】 使用场景下&#xff0c;往往存在一些不需要录入的计算列。但是用户希望变更计算要素时&#xff0c;相应的列也能立即重算&#xff0c;类似于Excel中公式的效果。 【问题】 通过字段默认值用函数设置&#xff0c;可以达到如上效果&#xff0c;但是在复杂场景下存在限…

广义表的深度与长度

1.广义表的长度和深度 1.长度&#xff1a;广义表的长度是指广义表中第一层所含的元素个数&#xff0c;包括原子和子表。 理解&#xff1a;广义表的长的也就是最外层的括号中包含的元素的个数 2.深度&#xff1a;广义表的深度是指广义表中括号的最大层数&#xff0c;即最大嵌套…

centos7 如何安装UI

CentOS 7 带有 GNOME 3 桌面环境&#xff0c;可以通过以下步骤启用&#xff1a; 确认系统已安装 GNOME 桌面环境&#xff1a;在终端中输入以下命令并按回车键&#xff1a; 复制 rpm -q gnome-desktop3如果输出结果中显示 "gnome-desktop3-3.x.x-x.el7.x86_64"&#…

Chrome 插件 storage API 解析

Chrome.storage API 解析 使用 chrome.storage API 存储、检索和跟踪用户数据的更改 一、各模块中的 chrome.storage 内容 1. Service worker 中 runtime 内容 2. Action 中 runtime 内容 3. Content 中 runtime 内容 二、权限&#xff08;Permissions&#xff09; 如果需使…

2024 年学习 AI 路线图

2024 年学习 AI 路线图 一、数学二、工具2.1 Python2.2 PyTorch 三、机器学习3.1 从头开始编写3.2 参加比赛3.3 做副业项目3.4 部署模型3.5 补充材料 四、深度学习4.1 fast.ai4.2 多参加一些比赛4.3 论文实现4.4 计算机视觉4.5 强化学习4.6 自然语言处理 五、大型语言模型5.1 观…

mysql 用户管理-权限表

学习了《mysql5.7安装》&#xff0c;就先再了解下用户管理&#xff0c;先了解下权限表。 MySQL是一个多用户数据库&#xff0c;具有功能强大的访问控制系统&#xff0c;可以为不同用户指定允许 的权限。MySQL用户可以分为普通用户和root用户。root 用户是超级管理员,拥有所有权…

加密技术解析:对称加密、非对称加密与国密算法

文章目录 一、对称加密1.1 综述1.2 AES 算法详解 二、非对称加密2.1 综述2.2 RSA 算详解 三、国密四、总结 在当今数字化世界中&#xff0c;加密技术在保护数据安全和隐私方面发挥着重要作用。本文将详细探讨对称加密、非对称加密以及国密算法的原理和实现&#xff0c;帮助读者…