350. 两个数组的交集 II

news/2025/1/8 19:38:10/文章来源:https://www.cnblogs.com/drunkerl/p/18660418

两个数组的交集 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]

思路

使用 Hash 表解决这道题目:

  1. 预处理 Hash 表:记录 num1 中每一个元素出现的次数。
  2. 遍历 nums2:对每个 nums2 中的元素,如果它存在于 nums1 中并且 count > 0,则将该元素添加进交集当中,并更新 Hash 表。
  3. 返回交集结果:返回一个包含交集元素的数组,且每个元素的出现次数与在原始数组中的出现次数一致。
class Solution {public int[] intersect(int[] nums1, int[] nums2) {// 如果 nums1 的长度大于 nums2 的长度,则交换 nums1 和 nums2,以减少遍历次数// 因为我们可以先遍历较小的数组,这样可以优化性能if (nums1.length > nums2.length) {return intersect(nums2, nums1); // 递归调用,交换两个数组}// 创建一个哈希表 map,用来记录 nums1 中每个元素的出现次数Map<Integer, Integer> map = new HashMap<>();// 遍历 nums1,统计每个数字出现的次数for (int num : nums1) {// 获取当前 num 在 map 中的出现次数(若不存在则默认为 0),然后将其次数加 1int count = map.getOrDefault(num, 0) + 1;// 将 num 和更新后的计数存入哈希表map.put(num, count);}// 创建一个数组 intersection,用于存储交集元素// 最多会有 nums1.length 个元素,所以数组大小为 nums1.lengthint[] intersection = new int[nums1.length];// index 变量记录当前交集数组的插入位置int index = 0;// 遍历 nums2,查找其中与 nums1 的交集for (int num : nums2) {// 获取 num 在 map 中的出现次数(如果不存在,默认返回 0)int count = map.getOrDefault(num, 0);// 如果 num 出现次数大于 0,表示它是交集的一部分if (count > 0) {// 将 num 加入交集数组,并更新交集数组的插入位置intersection[index++] = num;// 将 num 在 map 中的计数减 1,表示已经使用一个该元素count--;// 如果该元素的计数仍大于 0,则更新哈希表if (count > 0) {map.put(num, count);} else {// 如果该元素的计数为 0,则从哈希表中移除该元素map.remove(num);}}}// 使用 Arrays.copyOfRange 返回交集数组的有效部分,长度为 indexreturn Arrays.copyOfRange(intersection, 0, index);}
}

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

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

相关文章

AGC041F Histogram Rooks

我不知道啊,我只是觉得容斥很好玩。一个朴素的想法是容斥:考虑钦定 \(S\) 集合的位置没有被车覆盖,则答案是 \((-1)^{|S|}2^{c}\),其中 \(c\) 是可以放车的位置,可以直接 dp 做到 \(\mathrm{O}(2^n \text{poly}(n))\),但是难以优化。 延续容斥的想法,注意到钦定一个位置…

rust学习十六.1、并发-乱弹和一个简单并发例子

如书本作者所言,并发编程在绝大部分语言中,都是相对复杂和困难的。 所以,涉及的内容会相对多一些,所涵盖的内容绝对不是几篇文章所可以容纳的。 权当一个乱弹琴! 和此系列的其它文章一样,本文的内容绝大部分来自于相关书籍,本人做了一些摘裁的工作,取我所需!一、无畏并…

解决jenkins git 拉取代码超时问题

jenkins默认的是时间是10分钟,在git fetch时候超过10分钟了就报错失败了,可在项目源码管理 新增 advance clone behaviours

Java Bluetooth 蓝牙通讯 BlueCove 扫描附近的蓝牙设备

目录BlueCove项目概述BlueCove API架构API的设计原则和实现方式关键类和方法的功能描述测试代码获取本机(PC)蓝牙扫描蓝牙 BlueCove项目概述 BlueCove是一个开源的蓝牙协议栈实现,旨在为Java开发者提供一个全面的、易于使用的API,从而在应用程序中实现蓝牙功能。该项目支持多…

英伟达世界基础模型 Cosmos,教 AI 理解物理世界;阿里通义与雷鸟合作推出 AI 眼镜丨 RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的新闻」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑的…

.NET 窗口置于最顶层

本文介绍如何将窗口置于最顶层,以及解决在顶层显示时对锁屏登录界面的影响。用于实现类似Launcher、系统工具等应用需要窗口层级比Windows开始菜单以及置顶任务栏还要高的场景 一般情况下的窗口置顶,可以设置WPF窗口属性Topmost=true 也可以使用WIN32-SetWindowPos函数SetWin…

汽修行业的智能化转型:AI赋能员工培训SOP策略

随着智能化技术的飞速发展,汽修行业也迎来了前所未有的变革机遇。在这一背景下,如何构建高效、标准化的员工培训SOP(Standard Operating Procedure)策略,成为汽修企业提升竞争力、实现智能化转型的关键。本文将探讨智能AI在汽修行业员工培训SOP策略构建中的应用,特别是提…

智慧医疗新纪元:帮助中心引领的智能化转型之路

在科技日新月异的今天,智慧医疗已经成为医疗领域发展的重要趋势。智慧医疗不仅意味着医疗设备的智能化,更代表着整个医疗服务流程的数字化转型。在这一变革过程中,如何有效利用帮助中心驱动医疗机构的转型与升级,成为了一个值得深入探讨的课题。本文将探讨智慧医疗的智能跃…

sqlalchemy.exc.OperationalError

最后发现是 密码中含特殊字符@导致的连接报错其他参考: sqlalchemy.exc.OperationalError通常指示Python应用程序与数据库之间的连接出现问题。这里有一些可能的原因和解决方案:数据库连接参数错误:检查你的数据库连接字符串(DSN)。确保主机名、端口、数据库名称、用户名和…

五大优势:开源AI视频监控助力精准打击公租房非法倒卖行为

一. 用户痛点:传统监控面临的挑战与隐患 公租房作为社会保障性住房的一种,旨在为低收入群体提供基本的居住保障。然而,随着市场上房地产倒卖行为的增多,许多公租房被非法转租或倒卖给非资格居民,导致公租房资源流失、社会公平受损。政府在这方面的监管面临诸多困难,传统的…

Omnivore 替代品 Readeck 安装与使用教程

前段时间 Omnivore 宣布服务关停,作为一个长期使用 Omnivore 的用户,我需要寻找替代方案。 我对替代品的核心需求是:浏览器插件:支持一键剪藏当前网页。 RSS 支持:能够输入 RSS 地址并定时抓取更新。 API 接口:可以通过 API 与我的 logseq 进行集成。寻找替代品的过程: …

前端之canvas实现电子签约完成线上签署功能

电子签名,下载带有签名的合同png/pdf格式,前端/vue实现电子签功能。最近发现现在租房还是签合同,越来越多采用电子签约的方式进行,好处不用多说节约成本,节约时间。抱着好奇的心理,尝试自己动手实现一个电子签。原来并不复杂主要通过了canvas绘画能力进行实现的。最近发现…