首页/新闻资讯/正文详情

LeetCode 350题解析:哈希表与双指针法求数组交集

发布时间:2026/11/3 23:06:40 来源:云帆数科 栏目:资讯中心
LeetCode 350题解析:哈希表与双指针法求数组交集
1. 问题背景与需求分析这道题目来自LeetCode第350题是算法学习中的经典数组操作问题。给定两个整数数组nums1和nums2要求返回它们的交集其中结果中的每个元素出现的次数应与该元素在两个数组中出现的最小次数一致并且结果可以按任意顺序排列。举个例子如果输入是nums1 [1,2,2,1]nums2 [2,2]那么输出应该是[2,2]。因为数字2在第一个数组出现了两次在第二个数组也出现了两次所以结果中应该包含两个2。这类问题在实际开发中非常常见比如电商系统中找出用户浏览记录和购买记录中的共同商品社交网络中找出两个用户共同的好友列表数据分析时找出两个数据集中的重叠样本2. 基础解法哈希表计数法2.1 算法思路解析最直观的解法是使用哈希表在Python中可以用字典实现来统计数字出现的次数。具体步骤首先遍历较小的数组这样可以节省空间统计每个数字及其出现的次数然后遍历另一个数组对于每个数字如果在哈希表中存在且计数大于0就将该数字添加到结果中并将哈希表中的计数减12.2 Python实现代码def intersect(nums1, nums2): # 确保nums1是较短的数组 if len(nums1) len(nums2): return intersect(nums2, nums1) # 统计较短数组中数字的出现次数 count {} for num in nums1: count[num] count.get(num, 0) 1 result [] # 遍历较长数组 for num in nums2: if num in count and count[num] 0: result.append(num) count[num] - 1 return result2.3 复杂度分析时间复杂度O(mn)其中m和n分别是两个数组的长度。我们需要遍历两个数组各一次。空间复杂度O(min(m,n))哈希表的大小取决于较小数组的长度。提示在实际应用中如果内存非常紧张可以考虑先对两个数组排序然后使用双指针法这样可以将空间复杂度降到O(1)。3. 进阶解法排序双指针法3.1 算法思路解析当输入数组已经排好序时或者当内存空间非常有限时我们可以使用更高效的双指针法首先对两个数组进行排序初始化两个指针i和j分别指向两个数组的起始位置比较两个指针指向的数字如果相等加入结果两个指针都右移如果第一个数组的数字小i右移如果第二个数组的数字小j右移重复直到任一指针到达数组末尾3.2 Python实现代码def intersect(nums1, nums2): nums1.sort() nums2.sort() i, j 0, 0 result [] while i len(nums1) and j len(nums2): if nums1[i] nums2[j]: result.append(nums1[i]) i 1 j 1 elif nums1[i] nums2[j]: i 1 else: j 1 return result3.3 复杂度分析时间复杂度O(mlogm nlogn)排序的时间复杂度主导空间复杂度O(1)如果不考虑结果存储的空间4. 特殊情况处理与优化4.1 处理大数据量的情况当数组非常大时比如上百万元素内存可能无法一次性加载所有数据。这时可以考虑外部排序将数据分块排序后合并流式处理使用生成器逐步处理数据分布式处理使用MapReduce等框架4.2 元素范围已知的情况如果数组中的数字范围有限比如0-1000可以使用计数排序替代快速排序将时间复杂度降到O(mn)。4.3 多次查询优化如果需要多次查询不同数组的交集可以考虑预先建立倒排索引这样每次查询的时间复杂度可以降到O(n)。5. 实际应用中的注意事项5.1 内存优化技巧对于非常大的数组可以分批处理使用位图(Bitmap)代替哈希表来节省空间当元素范围不大时考虑使用布隆过滤器(Bloom Filter)进行初步筛选5.2 并行计算优化现代计算机通常有多核CPU可以将数组分块后并行统计使用多线程进行排序并行执行双指针遍历5.3 测试用例设计完善的测试用例应该包括常规情况有交集无交集的情况一个数组为空的情况包含重复元素的情况大数据量的性能测试6. 不同语言实现的差异6.1 Java实现特点Java中可以使用HashMap但需要注意自动装箱/拆箱的性能开销。对于基本类型int可以考虑使用SparseArray等优化结构。6.2 C实现特点C中可以使用unordered_map但需要注意内存管理。对于性能敏感的场景可以考虑预先分配足够大的哈希表。6.3 JavaScript实现特点JavaScript的对象本质就是哈希表但ES6引入了Map数据结构在处理大量数据时性能更好。7. 算法扩展与变种7.1 多个数组的交集当需要计算多个数组的交集时可以先找出两个数组的交集然后将结果与第三个数组求交集依此类推7.2 带权重的交集有时我们需要考虑元素的权重比如商品的价格用户的评分 这时可以在统计交集时同时计算某种聚合值如平均价格7.3 模糊交集在有些场景下我们可能需要找近似交集比如数字相差在一定范围内视为相同字符串相似度达到阈值视为匹配 这时需要修改比较逻辑使用模糊匹配算法8. 性能对比与选型建议8.1 小数据量场景哈希表法更简单直接代码更易理解和维护实际运行速度可能更快省去了排序时间8.2 大数据量场景排序双指针法内存占用更优更适合流式处理可以更好地利用现代CPU的缓存局部性8.3 特殊场景建议如果数组已经有序直接使用双指针法如果元素范围有限考虑计数排序双指针如果内存极度受限考虑外部排序磁盘上的双指针9. 常见错误与调试技巧9.1 边界条件处理容易出错的场景包括空数组输入所有元素相同的情况超大数字导致整数溢出9.2 哈希表实现细节忘记初始化哈希表没有正确处理数字0的情况在减少计数时没有检查是否大于09.3 双指针法的陷阱没有先排序数组指针移动逻辑错误没有处理指针越界的情况10. 实际工程应用案例10.1 推荐系统中的应用在电商推荐系统中我们可能需要找出用户浏览历史和购买历史的共同商品两个相似用户的共同偏好不同时间段的畅销商品交集10.2 数据分析中的应用数据分析时经常需要找出两个实验组的共同样本识别不同数据源中的重复记录计算不同时间窗口的重叠用户10.3 数据库查询优化SQL中的INTERSECT操作本质上就是求交集理解底层算法有助于优化查询性能设计更好的索引预估查询的资源消耗我在实际项目中发现对于中等规模的数据数万到数十万条记录哈希表法在大多数现代编程语言中表现都很出色。但当数据量达到百万级别时排序双指针法的优势就开始显现特别是当内存成为瓶颈时。一个实用的建议是对于已知数据量不大的情况选择更简单的实现对于可能面临大数据量的场景提前考虑更节省内存的方案。

相关推荐

JW5068A 8A同步降压电源设计:外围参数、保护配置与布局验收
JW5068A 8A同步降压电源设计:外围参数、保护配置与布局验收

简介:面向电源设计与硬件开发人员的JW5068A同步降压转换器芯片手册,适合在低功耗系统、工业商用设备、笔记本电脑及电视等场景中进行选型评估与电路设计时查阅。资源包仅含1个PDF文件,大小约926KB,集中呈现器件规格、引脚配置、极… · 2026/11/3 23:06:40

Buzz传播三触点:截屏、跨平台、用户补全
Buzz传播三触点:截屏、跨平台、用户补全

1. “buzz”不是随便起的网名,它是一套正在被低估的传播信号系统最近在几个技术社区和创意工作坊里,我反复听到这个词被当作动词用:“这个功能上线后得先造点buzz”,“那个视频没buzz起来,数据就卡在3000播放不动了”。… · 2026/11/3 23:06:40

构建自动化安全运营中心:开源工具整合实践
构建自动化安全运营中心:开源工具整合实践

1. 项目背景与核心价值去年在DEF CON黑客大会上看到一组数据:中小企业平均需要6.9个月才能发现网络入侵,而专业SOC团队的成本每年超过200万美元。这让我开始思考——能否用自动化工具构建一个"单人版"安全运营中心?经过三个月的原型… · 2026/11/3 23:05:39

MATLAB指纹识别GUI系统:细节点提取与空间匹配实战
MATLAB指纹识别GUI系统:细节点提取与空间匹配实战

简介:本资源是一套基于MATLAB实现的指纹识别GUI系统,面向图像处理初学者与生物特征识别课程实践者,聚焦指纹图像预处理、细节点提取与匹配核心流程。压缩包共10个文件,含8幅BMP格式指纹图像(用于测试与比对&#xff09… · 2026/11/3 23:57:15

MATLAB指纹识别实战:细节点提取与匹配全流程解析
MATLAB指纹识别实战:细节点提取与匹配全流程解析

简介:本资源是一套基于MATLAB实现的指纹识别GUI系统,面向图像处理初学者、生物特征识别课程设计者及自动化专业学生,聚焦指纹图像预处理、细节点提取与匹配等核心算法实践。压缩包共10个文件,含8幅BMP格式指纹样本图像&#xff08… · 2026/11/3 23:57:15

粒子群优化算法在随机森林调参中的应用实践
粒子群优化算法在随机森林调参中的应用实践

1. 粒子群优化与随机森林的化学反应 在机器学习的世界里,调参就像是在黑暗森林中寻找宝藏。传统的手动调参不仅耗时费力,还常常陷入局部最优的泥潭。而粒子群优化(PSO)算法就像是给每个调参方案装上了GPS导航系统,让参… · 2026/11/3 23:57:15

Kubernetes集群子网迁移实战:RKE2/K3s安全迁移方案
Kubernetes集群子网迁移实战:RKE2/K3s安全迁移方案

1. 项目概述最近在帮客户做Kubernetes集群网络改造时,遇到一个典型场景:原先部署在AWS VPC子网A中的RKE2集群,由于网络规划调整需要整体迁移到子网B。这个看似简单的需求背后其实暗藏玄机,今天就来详细聊聊如何安全地将RKE2/K3s下… · 2026/11/3 23:57:15

R语言ggplot2科研绘图实战:50套代码模板与投稿级参数调优
R语言ggplot2科研绘图实战:50套代码模板与投稿级参数调优

简介:面向有R语言基础、需要绘制SCI论文配图的科研人员与学生,这份资源整理为50套可直接运行的绘图代码模板,覆盖柱状图、箱线图、热图、火山图、富集分析、生存曲线、ROC曲线、PCA降维等常见科研图表。使用方式简单:将input目录中… · 2026/11/3 23:57:15

永恒之蓝漏洞解析与网络安全防御实践
永恒之蓝漏洞解析与网络安全防御实践

1. 永恒之蓝:网络安全史上的分水岭事件 2017年5月12日,全球网络安全格局被彻底改写。那天早晨,英国国家医疗服务体系(NHS)的医护人员发现电脑屏幕突然变红,所有患者档案被加密锁定。同一时间,西… · 2026/11/3 23:56:15

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码