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

哈希表优化四数相加II问题解法详解

发布时间:2026/11/2 13:05:02 来源:云帆数科 栏目:资讯中心
哈希表优化四数相加II问题解法详解
1. 问题背景与核心思路四数相加II是算法中一个经典的哈希表应用场景。给定四个整数数组nums1、nums2、nums3和nums4要求统计有多少个元组(i,j,k,l)满足nums1[i] nums2[j] nums3[k] nums4[l] 0。这个问题看似简单但如果采用暴力解法时间复杂度会达到O(n^4)这在数据量较大时是完全不可接受的。提示当遇到需要统计满足特定条件的组合数量时哈希表往往是优化时间复杂度的利器。2. 哈希表解法详解2.1 分组优化思路我们可以将四个数组分成两组第一组nums1和nums2第二组nums3和nums4这样做的目的是将O(n^4)的时间复杂度降低到O(n^2)。具体步骤如下首先计算nums1和nums2中所有元素两两相加的和并将这些和及其出现次数存入哈希表然后计算nums3和nums4中所有元素两两相加的和的相反数最后统计这些相反数在哈希表中出现的次数总和2.2 具体实现步骤def fourSumCount(nums1, nums2, nums3, nums4): from collections import defaultdict hashmap defaultdict(int) # 计算nums1和nums2的两两和 for n1 in nums1: for n2 in nums2: hashmap[n1 n2] 1 count 0 # 计算nums3和nums4的两两和的相反数 for n3 in nums3: for n4 in nums4: target -(n3 n4) if target in hashmap: count hashmap[target] return count2.3 时间复杂度分析构建哈希表阶段O(n^2)查询阶段O(n^2)总体时间复杂度O(n^2)空间复杂度O(n^2)哈希表存储所有可能的和3. 优化技巧与注意事项3.1 哈希表选择在Python中我们通常使用defaultdict或Counter来构建哈希表。defaultdict在这里更合适因为我们只需要简单的计数功能。3.2 边界条件处理空数组情况如果任一数组为空直接返回0大数相加注意整数溢出的问题在Python中不需要特别处理但在其他语言如C中需要注意3.3 性能优化可以优先处理较短的数组对减少哈希表的大小在实际编码中可以将两个循环合并减少代码行数4. 扩展思考4.1 类似问题这种分组哈希表的思路可以推广到其他类似问题三数之和四数之和K数之和当K较大时4.2 其他解法对比虽然哈希表解法在这里最优但也可以考虑排序双指针法时间复杂度相同但实现更复杂暴力解法仅适用于极小数据量5. 实际应用场景这种算法在实际中有多种应用统计满足特定条件的组合数据分析中的多维度匹配密码学中的碰撞检测6. 常见问题解答6.1 为什么选择两两分组将四个数组分成两组是最优的分组方式因为两组对称实现简单时间复杂度从O(n^4)降到O(n^2)空间复杂度也在可接受范围内6.2 如果数组长度不同怎么办算法对数组长度没有限制不同长度仍然适用。哈希表的大小由前两个数组决定查询阶段由后两个数组决定。6.3 如何处理重复元素哈希表自动处理了重复元素的问题因为我们是统计和的出现次数而不是具体的元素组合。7. 代码实现细节7.1 Python实现优化def fourSumCount(nums1, nums2, nums3, nums4): from collections import Counter AB Counter(ab for a in nums1 for b in nums2) return sum(AB[-c-d] for c in nums3 for d in nums4)这个实现更加简洁利用了Python的生成器表达式和Counter的特性。7.2 C实现示例#include unordered_map #include vector int fourSumCount(vectorint nums1, vectorint nums2, vectorint nums3, vectorint nums4) { unordered_mapint, int hashmap; for (int a : nums1) for (int b : nums2) hashmap[a b]; int count 0; for (int c : nums3) for (int d : nums4) if (hashmap.count(-(c d))) count hashmap[-(c d)]; return count; }8. 测试用例设计好的测试用例应该包含常规情况边界情况空数组大量重复元素正负数混合极值情况示例测试用例assert fourSumCount([1,2], [-2,-1], [-1,2], [0,2]) 2 assert fourSumCount([0], [0], [0], [0]) 1 assert fourSumCount([], [], [], []) 0 assert fourSumCount([1]*100, [-1]*100, [1]*100, [-1]*100) 1000000009. 算法可视化理解为了更好理解这个算法可以想象首先将前两个数组的所有可能和计算出来存入哈希表类似建立了一个和数据库然后计算后两个数组的所有可能和的相反数去和数据库中查询匹配每匹配一次就增加对应的计数这种预处理查询的模式在很多算法中都有应用。10. 进阶思考如果问题变为找出所有满足条件的四元组而不仅仅是计数该如何修改算法这种情况下哈希表中需要存储的不是和的计数而是和对应的索引对列表。这样在查询阶段对于每个匹配的和我们可以得到所有可能的索引组合。不过这会显著增加空间复杂度。

相关推荐

Vue Element Admin路由动画原理与实战调优
Vue Element Admin路由动画原理与实战调优

1. 这套路由动画到底在动什么:先看清 AppMain 里的三行代码第一次接触 Vue Element Admin 的人,十个里有八个会问同一个问题:「我点菜单,页面怎么是硬切过去的,一点过渡都没有?」其实不是没有,而… · 2026/11/2 13:05:02

OpenSSL 1.1.1源码编译、EVP加解密与TLS握手排错实战
OpenSSL 1.1.1源码编译、EVP加解密与TLS握手排错实战

简介:OpenSSL_1.1.1 是面向 Windows 32 位平台开发者的一份 SSL/TLS 与密码学开发运行包,适合需要在 C/C 项目中集成加密通信、证书处理或命令行调试的初中级工程师。压缩包共约 2000 个文件,整体 16.22MB,以 HTML 帮助文档和头文… · 2026/11/2 13:05:02

OpenAI挖走OpenClaw核心维护者:开源AI Agent的维护者依赖与工程化落地
OpenAI挖走OpenClaw核心维护者:开源AI Agent的维护者依赖与工程化落地

1. 从“龙虾之父”出走说起:一个信号被大多数人读反了“OpenAI抢走‘龙虾之父’”这个说法在圈子里传开的时候,我第一反应不是去看热闹,而是去翻OpenClaw这个项目的提交记录和社区讨论。原因很简单:一个开源项目的核心维护者被大厂… · 2026/11/2 13:04:00

钢管切割问题:从组合优化建模到车间落地的完整求解流程
钢管切割问题:从组合优化建模到车间落地的完整求解流程

钢管切割这个问题,乍一看像是车间里的粗活,真上手算过一遍的人都知道,它骨子里是一道披着工业外衣的组合优化题。我最早接触它是在一个做金属结构件的小厂里,当时车间主任拿着一张三米长的原料清单和一堆长短不一的订单尺寸&#… · 2026/11/2 17:49:42

智慧医院物流供应链系统的精益设计与技术实现
智慧医院物流供应链系统的精益设计与技术实现

1. 智慧医院物流供应链系统概述智慧医院物流供应链系统是医疗信息化建设的重要组成部分,它通过物联网、大数据、人工智能等技术手段,对医院内部的药品、耗材、设备等物资流动进行全流程数字化管理。这套系统能够显著提升医院运营效率,降低医疗… · 2026/11/2 17:49:42

Qt飞机大战C++完整工程解析:从QGraphicsScene到碰撞检测
Qt飞机大战C++完整工程解析:从QGraphicsScene到碰撞检测

简介:这是一份面向Qt与C初学者及课程设计学习者的2D射击游戏完整项目源码,基于Qt框架与QGraphicsView图形视图模块实现飞机、子弹、敌机的动态渲染,涵盖键盘事件响应、QTimer定时动画、碰撞检测、音效播放与资源管理等核心知识点,… · 2026/11/2 17:49:42

VoiceStudio:开源语音工作流操作系统与Electron底层实践
VoiceStudio:开源语音工作流操作系统与Electron底层实践

1. VoiceStudio不是“又一个语音克隆工具”,而是开源语音工作流的底层操作系统你搜“VoiceStudio”时,大概率会看到一堆零散的GitHub star、Electron打包截图、AGPL-3.0许可证弹窗,还有人问“怎么在鸿蒙上跑”。但没人告诉你:它根… · 2026/11/2 17:49:42

ODM模式解析:从概念到商业实践
ODM模式解析:从概念到商业实践

1. ODM模式深度解析:从概念到商业实践在消费电子、家电、医疗器械等行业,我们经常听到"ODM"这个术语。作为从业15年的产品开发专家,我见证了大量品牌商通过ODM模式快速推出市场爆款。今天我们就来彻底拆解这种"交钥匙"式… · 2026/11/2 17:49:42

GPT-Image API 实战:图片编辑蒙版与 Alpha 通道避坑指南
GPT-Image API 实战:图片编辑蒙版与 Alpha 通道避坑指南

最近我把 GPT-Image API 接进一个图片批处理工具里,需求本身不复杂:给商品图换背景、去掉照片角落的水印、局部改个颜色。原以为一个编辑接口几分钟调通,结果在图片蒙版(mask)和 Alpha 通道上反反复折腾了两天&#xf… · 2026/11/2 17:48:41

双极步进电机控制实战: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/2 4:42:45

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/2 5:17:18

雷达信号调制技术解析:从LFM到伪线性调频原理与应用
雷达信号调制技术解析:从LFM到伪线性调频原理与应用

/* 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 1:01:15

基于MAX14431与TM4C123的工业SPI隔离电路设计全攻略
基于MAX14431与TM4C123的工业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/2 1:01:15

PLFM_RADAR:相位线性调频雷达信号处理框架
PLFM_RADAR:相位线性调频雷达信号处理框架

/* 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 1:01: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/2 4:42:45

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/2 5:17:18

了解更多?预约专属演示

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

企业微信二维码