当前位置: 首页 > 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.lryc.cn/news/426293.html

相关文章:

  • 基于YOLOv8的缺陷检测任务模型训练
  • 【upload]-ini-[SUCTF 2019]CheckIn-笔记
  • uniapp条件编译使用教学(#ifdef、#ifndef)
  • NXP i.MX8系列平台开发讲解 - 4.1.2 GNSS 篇(二) - 卫星导航定位原理
  • 怎样在 SQL 中对一个包含销售数据的表按照销售额进行降序排序?
  • DIAdem 与 LabVIEW
  • UE虚幻引擎可以云渲染吗?应用趋势与挑战了解
  • 实战分享:DefenderUI在企业环境中的部署与应用
  • 中英双语介绍金融经济中的鹰派 (Hawkish)和鸽派 (Dovish)
  • Android 开发中常用的布局类型及其选择指南
  • 短视频SDK解决方案,降低行业开发门槛
  • 【C++】String常见函数用法
  • LeetCode49.字母异位词分组
  • Nginx日志按天分割
  • 文本摘要简介
  • 3.MySQL面试题之Redis 和 Mysql 如何保证数据一致性?
  • 浅谈TCP协议、UDP协议
  • SQL业务题: 从不订购的客户
  • 怎么直接在PDF上修改内容?随心编辑PDF内容
  • 聊天室项目测试报告
  • 语音识别(实时语音转录)——funasr的详细部署和使用教程(包括实时语音转录)
  • 【网络编程】TCP机械臂测试
  • 笔记:在WPF中如何注册控件级全局事件和应用程序级全局事件
  • 【Linux系列】telnet使用入门
  • 音视频相关知识
  • 数据结构--第七天
  • 代码随想录Day34:62.不同路径、63.不同路径II、343.整数拆分、96.不同的二叉搜索树
  • 【信息学奥赛一本通】1008:计算(a+b)/c的值
  • 使用 jstat 进行 Java 应用程序性能监控
  • Prompt指令调优大揭秘