当前位置: 首页 > news >正文

leetcode350. 两个数组的交集 II,哈希表

leetcode350. 两个数组的交集 II

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

示例 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
在这里插入图片描述

题目分析

题目描述

给定两个整数数组 nums1nums2,返回两个数组的交集。输出结果中的每个元素出现的次数,应与元素在两个数组中出现的次数一致。

算法分析

这个问题可以通过哈希表(无序映射)来解决。我们使用两个哈希表(p1p2)来存储两个数组中每个元素的出现次数。然后,我们遍历第一个哈希表,对于每个元素,如果它在第二个哈希表中也存在,则计算两个哈希表中该元素出现次数的最小值,并将其添加到结果数组中。

算法步骤

  1. 初始化两个哈希表 p1p2
  2. 遍历数组 nums1,将每个元素及其出现次数存储在 p1 中。
  3. 遍历数组 nums2,将每个元素及其出现次数存储在 p2 中。
  4. 初始化一个空向量 res 来存储结果。
  5. 遍历 p1,对于每个元素 k
    • 如果 p2 中包含 k,则找到 p2k 的位置。
    • 计算 p1k 的出现次数和 p2k 的出现次数的最小值。
    • k 添加到 res 中,次数为最小值。
  6. 返回 res

算法流程

开始
初始化无序映射 p1 和 p2
遍历 nums1
存储 nums1 元素在 p1
遍历 nums2
存储 nums2 元素在 p2
初始化空向量 res
遍历 p1
检查 p2 中是否包含 k
找到 p2 中 k 的位置
计算 p1 中 k 的出现次数和 p2 中 k 的出现次数的最小值
将 k 添加到 res 中 次数为最小值
返回 res
结束

具体代码

class Solution {
public:vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {unordered_map<int,int> p1;unordered_map<int,int> p2;for(int i=0;i<nums1.size();i++){p1[nums1[i]]++;}for(int i=0;i<nums2.size();i++){p2[nums2[i]]++;}vector<int> res;for(auto k:p1){if(p2.count(k.first)){auto t=p2.find(k.first);int p1size=k.second;int p2size=t->second;  int size=min(p1size,p2size);for(int j=0;j<size;j++){res.push_back(k.first);}}}return res;}
};

算法分析

复杂度分析

  • 时间复杂度:O(m+n),其中 m 和 n 分别是两个数组的长度。我们只需要遍历两个数组一次。
  • 空间复杂度:O(m+n),我们需要存储两个数组的元素及其出现次数,这取决于数组的长度。

易错点

  • 在初始化两个无序映射时,确保正确地存储每个元素及其出现的次数。
  • 在比较两个映射中的元素时,确保正确地使用 count 函数。
  • 在计算最小出现次数时,确保正确地使用 min 函数。

注意事项

  • 确保在遍历数组时不要超出数组的边界。
  • 在处理映射时,确保不会覆盖任何元素。

相似题目

题目链接
两个数组的交集 IIhttps://leetcode.com/problems/intersection-of-two-arrays-ii/
数组交集https://leetcode.com/problems/intersection-of-two-arrays/
查找重复的子树https://leetcode.com/problems/find-duplicate-subtrees/
两数之和https://leetcode.com/problems/two-sum/

http://www.mrgr.cn/news/471.html

相关文章:

  • leetcode_53. 最大子数组和
  • MCU复位RAM会保持吗,如何实现复位时变量数据保持
  • 网络编程 8/15 基于UDP多人聊天室
  • linux部署elasticserch单节点
  • js取消焦点事件
  • 【边缘计算与智能家居】边缘计算在智能家居中的应用
  • c#实现数据导出为PDF的方式
  • Java用JNA调用dll : Invalid memory access
  • 稚晖君发布5款全能人形机器人,开源创新,全能应用
  • 一元闯关游戏
  • 宝塔面板部署webman项目+nginx反向代理
  • 深度学习--转换拼接问题 + TensorFlow包弃用问题
  • 在MuMu模拟器中的游戏如何设置变声器?电脑变声器开麦就变声!6款实时变声软件!TM真的炫!
  • SQLite3使用接口写入二进制文件
  • 高级java每日一道面试题-2024年8月15日-设计模式篇-设计模式与面向对象原则的关系是什么?
  • 构筑信息安全的桥梁:安全信息交换(SIX)全面解析
  • C++之函数传参方式
  • ImageMagick从pdf导出高清图片
  • 宝兰德荣获openEuler项目群青铜捐赠人称号,共筑开源生态繁荣新篇章
  • STM32标准库学习笔记-9.DMA 直接存储器存取