349. 两个数组的交集 题解

题目描述:349. 两个数组的交集 - 力扣(LeetCode)

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

 方法一:

解题思路:

我们可以采用排序和双指针的方法来求两个数组的交集。

  1. 对两个输入数组 nums1nums2 进行排序,以便能够有效地在有序数组中查找交集元素。

  2. 初始化两个指针 ptr1ptr2,分别指向数组 nums1nums2 的起始位置。

  3. 创建一个结果数组,用于存储交集元素。同时,创建一个变量 count 用于记录结果数组中的元素个数。

  4. 开始循环遍历两个有序数组:

    • 比较 nums1[ptr1]nums2[ptr2]
    • 如果两个元素相等,则将这个元素添加到结果数组中,然后增加 ptr1ptr2
    • 如果 nums1[ptr1] 小于 nums2[ptr2],则增加 ptr1
    • 如果 nums1[ptr1] 大于 nums2[ptr2],则增加 ptr2
  5. 循环继续,直到任一指针达到其数组的末尾。

  6. 返回结果数组,同时更新 count 为结果数组中的元素个数。

代码:

// 比较函数,用于排序
int compare(const void *a, const void *b) {return (*(int *)a - *(int *)b);
}int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {qsort(nums1, nums1Size, sizeof(int), compare);qsort(nums2, nums2Size, sizeof(int), compare);int *result = (int *)malloc(sizeof(int) * (nums1Size < nums2Size ? nums1Size : nums2Size));int count = 0;int i = 0, j = 0;while (i < nums1Size && j < nums2Size) {if (nums1[i] == nums2[j]) {// 避免重复添加相同元素if (count == 0 || nums1[i] != result[count - 1]) {result[count++] = nums1[i];}i++;j++;} else if (nums1[i] < nums2[j]) {i++;} else {j++;}}*returnSize = count;return result;
}

方法二:

解题思路:

利用哈希集合

  1. 初始化一个哈希集合,用于存储 nums1 数组中的元素。

  2. 遍历 nums1 数组,将其中的元素加入哈希集合中。

  3. 创建一个结果数组,用于存储交集元素。

  4. 遍历 nums2 数组,对于其中的每个元素,判断是否在哈希集合中出现:

    • 如果出现,则将该元素加入结果数组,并从哈希集合中移除,以避免重复添加相同元素。
  5. 返回结果数组。

代码:

typedef struct
{int *data;int size;
} HashSet;// 初始化哈希集合
HashSet* initHashSet()
{HashSet* set = (HashSet*)malloc(sizeof(HashSet));set->data = (int *)calloc(1000, sizeof(int));  // 注意初始化一定要是0set->size = 0;return set;
}// 将元素加入哈希集合
void addToHashSet(HashSet* set, int num)
{set->data[num] = 1;set->size++;
}// 判断元素是否在哈希集合中
int isInHashSet(HashSet* set, int num)
{return set->data[num];
}// 释放哈希开辟的内存
void freeHashSet(HashSet* set)
{free(set->data);free(set);
}int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize)
{HashSet* set = initHashSet();// 将数组1中的元素添加到哈希集合中for(int i=0;i<nums1Size;i++){addToHashSet(set, nums1[i]);}int* ret = (int*)malloc(sizeof(int)*(nums1Size<nums2Size?nums2Size:nums1Size));int count = 0;// 查询for(int i=0;i<nums2Size;i++){if(isInHashSet(set, nums2[i])){// 添加ret[count++] = nums2[i];set->data[nums2[i]] = 0; // 避免重复添加}}*returnSize = count;freeHashSet(set);return ret;
}

总结:

哈希集合方法:

  • 时间复杂度:O(m + n),其中 m 是 nums1 的长度,n 是 nums2 的长度。

    • 创建哈希集合需要 O(m) 的时间,因为需要将 nums1 中的元素加入集合。
    • 遍历 nums2 并检查元素是否在哈希集合中需要 O(n) 的时间。
    • 最终的结果遍历需要 O(min(m, n)) 的时间,其中 min(m, n) 是结果数组的长度。
  • 空间复杂度:O(m) 或 O(n),取决于 nums1 数组的大小。

    • 哈希集合需要存储 nums1 中的元素,因此需要 O(m) 的额外空间。

排序和双指针方法:

  • 时间复杂度:O(m * log m + n * log n + m + n),其中 m 是 nums1 的长度,n 是 nums2 的长度。

    • 排序 nums1nums2 需要 O(m * log m) 和 O(n * log n) 的时间。
    • 遍历两个有序数组需要 O(m + n) 的时间。
    • 最终的结果遍历需要 O(min(m, n)) 的时间。
  • 空间复杂度:O(1)。

    • 这种方法只使用了常量级的额外空间用于存储指针和计数。

总结起来,如果在意时间复杂度,当 mn 较小时,两种方法的时间复杂度都差不多,但哈希集合方法在一些特定情况下可能会稍微快一些。然而,如果在意空间复杂度,排序和双指针方法的空间复杂度更低。


本次内容到此结束了!如果你觉得这篇博客对你有帮助的话 ,希望你能够给我点个赞,鼓励一下我。感谢感谢……

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

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

相关文章

webshell实践,在nginx上实现负载均衡

1、配置多台虚拟机&#xff0c;用作服务器 在不同的虚拟机上安装httpd服务 我采用了三台虚拟机进行服务器设置&#xff1a;192.168.240.11、192.168.240.12、192.168.240.13 [rootnode0-8 /]# yum install httpd -y #使用yum安装httpd服务#开启httpd服务 [rootnode0-8 /]# …

基于深度学习的铁路异物侵限检测算法研究_整体认知感觉欠点意思,但是有一个新的变形卷积-Octave 卷积

相比于其他的交通运输方式&#xff0c;铁路运输具有准时性高、连续性强、速度快、运输量大、运输成本低以及安全可靠等优点。同时由于国家高速铁路网络建设的不断推进&#xff0c;铁路运输逐渐成为我国客运与货运的主要运输方式。虽然铁路运输为人们出行和货物运输带来的极大的…

Java IO流(二)IO模型(BIO|NIO|AIO)

概述 Java IO模型同步阻塞IO&#xff08;BIO&#xff09;、同步非阻塞IO&#xff08;NIO&#xff09;、异步非阻塞IO&#xff08;AIO/NIO2&#xff09;,Java中的BIO、NIO和AIO理解为是Java语言对操作系统的各种IO模型的封装 IO模型 BIO(Blocking I/O) 概述 BIO是一种同步并阻…

计算机组成与设计 Patterson Hennessy 笔记(二)MIPS 指令集

计算机的语言&#xff1a;汇编指令集 也就是指令集。本书主要介绍 MIPS 指令集。 汇编指令 算数运算&#xff1a; add a,b,c # abc sub a,b,c # ab-cMIPS 汇编的注释是 # 号。 由于MIPS中寄存器大小32位&#xff0c;是基本访问单位&#xff0c;因此也被称为一个字 word。M…

汽车领域专业术语

1. DMS/OMS/RMS/IMS DMS&#xff1a;即Driver Monitoring System&#xff0c;监测对象为Driver&#xff08;驾驶员&#xff09;。DMS三大核心&#xff1a; OMS&#xff1a;即Occupancy Monitoring System&#xff0c;监测对象为乘客。 RMS&#xff1a;后排盲区检测系统 IMS&…

PHP自己的框架实现config配置层级存取(完善篇二)

1、实现效果 config(include_once $coreConfig); //加载配置文件config() //获取所有配置 config(DB_HOST) 获取配置 2、按层级配置文件加载&#xff0c;存取配置项 config,function.php function config($varNULL,$valueNULL){static $configarray();if(is_array($var)){…

redis Windows版本安装过程(5.0.14)

官网不提供Windows版本的redis安装包&#xff0c;但可以在GitHub网站上找到redis的安装包&#xff1a; Releases tporadowski/redis GitHub &#xff08;相比较Linux其他版本的Redis,Windows版的redis的缺点是版本比较老&#xff0c;官方不提供且不更新&#xff09; 1、zip…

vue使用

详解vue使用Echarts画柱状图_vue.js_脚本之家 Vue修改按钮间距使用 margin-left Vue3 定义变量 &#xff08;没有data了&#xff09; vue3的setup函数中定义data数据&#xff0c;使用data数据_vue3 data_半里_辰昏的博客-CSDN博客 const showFlag ref(false) 修改值&#…

Java源码分析(一)Integer

当你掌握Java语言到了一定的阶段&#xff0c;或者说已经对Java的常用类和API都使用的行云流水。你会不会有一些思考&#xff1f;比如&#xff0c;这个类是如何设计的&#xff1f;这个方法是怎么实现的&#xff1f;接下来的一系列文章&#xff0c;我们一起学习下Java的一些常见类…

【河源源城紫金】IBM 3650 M4服务器主板维修

河源市源城区某财政单位2台IBM System x3650 M4 服务器黄灯故障无法开机&#xff0c;面板报错BOARD黄灯警告&#xff0c;如上图所示&#xff0c;这位客户通过单位朋友介绍&#xff0c;报修2台单位的IBM服务器&#xff0c;冠峰工程师接到客户报修信息后&#xff0c;售后小哥随即…

Linux笔试题(4)

67、在局域网络内的某台主机用ping命令测试网络连接时发现网络内部的主机都可以连同,而不能与公网连通,问题可能是__C_ A.主机ip设置有误 B.没有设置连接局域网的网关 C.局域网的网关或主机的网关设置有误 D.局域网DNS服务器设置有误 解析&#xff1a;在局域网络内的某台主…

WebGL和OpenGL之间的差异

推荐&#xff1a;使用 NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景 WebGL和OpenGL是与图形处理有关的技术标准&#xff0c;它们在计算机图形中扮演着重要的角色。本文将介绍WebGL和OpenGL的区别&#xff0c;并重点介绍"WebGL"和"OpenGL"的特点。 一…

226、仿真-基于51单片机楼道教室走道智能灯光光照人体感应检测控制Proteus仿真设计(程序+Proteus仿真+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、程序源码 资料包括&#xff1a; 需要完整的资料可以点击下面的名片加下我&#xff0c;找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选择 方案一&…

16.3.2 【Linux】程序的管理

程序之间是可以互相控制的。举例来说&#xff0c;你可以关闭、重新启动服务器软件&#xff0c;服务器软件本身是个程序&#xff0c; 你既然可以让她关闭或启动&#xff0c;当然就是可以控制该程序。 使用kill-l或者是man 7 signal可以查询到有多少个signal。主要的讯号代号与名…

当众讲话与演讲口才沙龙活动策划方案

活动名称&#xff1a;当众讲话与演讲口才沙龙 活动目的&#xff1a; 当众讲话与演讲口才沙龙旨在提升参与者的演讲口才能力&#xff0c;培养自信心和表达能力&#xff0c;促进交流与分享。通过举办此活动&#xff0c;我们希望能够帮助参与者克服公众演讲的恐惧&#xff0c;提…

C++ string 的用法

目录 string类string类接口函数及基本用法构造函数&#xff0c;析构函数及赋值重载函数元素访问相关函数operator[]atback和front 迭代器iterator容量操作size()和length()capacity()max_sizeclearemptyreserveresizeshrink_to_fit string类对象修改操作operatorpush_backappen…

【Flink】Flink窗口触发器

数据进入到窗口的时候,窗口是否触发后续的计算由窗口触发器决定,每种类型的窗口都有对应的窗口触发机制。WindowAssigner 默认的 Trigger通常可解决大多数的情况。我们通常使用方式如下,调用trigger()方法把我们想执行触发器传递进去: SingleOutputStreamOperator<Produ…

vue3.0 element-plus 不同版本 el-popover 循环优化

表格内循环el-popover 渲染以后的页面&#xff0c;数据量很大的时候页面会卡&#xff0c;生成的代码&#xff1a; 解决思路&#xff1a;将el-popover提出来&#xff0c;不参与循环&#xff0c;让el-popover只渲染一次 1、以1.1.0-beta.24版为例&#xff08;低版本&#xff09;…

Bigemap Pro国产基础软件介绍——一款多源数据处理软件

一、软件简介 Bigemap Pro是由成都比格图数据处理有限公司(下称”BIGEMAP”)开发和发行的国产大数据处理基础软件。Bigemap Pro是在BIGEMAP GIS Office基础上&#xff0c;经过十年的用户积累与反馈和技术更新迭代出的新一代基础软件产品。Bigemap Pro国产基础软件集成了数据采…

Qt应用开发(基础篇)——高级纯文本窗口 QPlainTextEdit

一、前言 QPlainTextEdit类继承于QAbstractScrollArea&#xff0c;QAbstractScrollArea继承于QFrame&#xff0c;是Qt用来显示和编辑纯文本的窗口。 滚屏区域基类https://blog.csdn.net/u014491932/article/details/132245486?spm1001.2014.3001.5501框架类QFramehttps://blo…