尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
哈希表优化四数相加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. 进阶思考如果问题变为找出所有满足条件的四元组而不仅仅是计数该如何修改算法这种情况下哈希表中需要存储的不是和的计数而是和对应的索引对列表。这样在查询阶段对于每个匹配的和我们可以得到所有可能的索引组合。不过这会显著增加空间复杂度。
RELATED

相关推荐

RFID技术在信创资产管理中的应用与创新

RFID技术在信创资产管理中的应用与创新

1. 项目概述:RFID如何终结条码时代的资产管理痛点十年前我第一次参与企业固定资产盘点时,亲眼目睹了行政部同事跪在地上用扫码枪逐个扫描设备条码的狼狈场景。当扫码枪第三次发出"滴——"的报警声时,那位同事崩溃地发现又是条码污损…

📅 2026/11/2 12:59:40
SQL Server日志分析实战:从海量日志到故障定位的完整流程

SQL Server日志分析实战:从海量日志到故障定位的完整流程

数据库日志这东西,平时没人愿意多看一眼,出了事却第一个被翻出来。我做后端运维那几年,最怕半夜接到电话说"数据库慢了""数据对不上",然后一头扎进几个G的日志文件里逐行翻找。后来接触到一类专门做日志解析的…

📅 2026/11/2 12:59:40
Selenium自动化测试进阶:多浏览器并行与性能优化

Selenium自动化测试进阶:多浏览器并行与性能优化

1. Selenium自动化测试进阶实战概述 在Web应用开发领域,自动化测试已经成为保障产品质量不可或缺的一环。Selenium作为最主流的浏览器自动化工具,其WebDriver接口允许我们以编程方式模拟真实用户操作。但很多测试工程师在使用过程中往往停留在基础的单浏…

📅 2026/11/2 12:59:40
MORE NEWS

更多资讯

📰

LLM如何成为专业软件工程中的可信协作者

1. 这不是“AI写代码”,而是工程师与大模型的协同作战现场最近三个月,我带的三个交付团队——一个做金融风控系统重构,一个做医疗影像标注平台二期,一个做工业PLC远程诊断中间件——全部在生产环境里把LLM当成了“第七名全职工程师…

📰

Agent判断器选型与部署:Laya与Jev对比实战

最近在给一个内部Agent工具箱做升级时,遇到一个挺典型的痛点:任务拆解、工具调用、结果汇总都跑通了,可一旦让Agent自己决定“下一步该调用哪个工具、该不该执行这个动作”,就开始翻车。不是把不该发的消息发出去了,就…

📰

OpenClaw部署指南:Node.js环境配置与多平台安装详解

1. OpenClaw部署环境准备OpenClaw是一个基于Node.js开发的现代化开发工具链,部署前需要确保系统满足以下基础环境要求:1.1 操作系统兼容性OpenClaw支持三大主流操作系统平台:Linux:包括主流发行版(Ubuntu/Debian/CentO…

📰

消费级BCI设备的固件级隐私设计:从Muse数据滞留看脑电数据治理

1. 这不是“数据泄露”,而是“数据滞留”:从Muse设备事件看消费级脑电产品的隐私设计盲区最近在几个硬件开发群和医疗AI论坛里,陆续看到有人提到Muse头带设备的隐私争议——不是传统意义上黑客攻破服务器、批量盗取用户数据的那种“泄露”&am…

📰

OpenSSL 1.1.1f 源码编译安装指南:从报错到验证的完整实践

简介:这份资源是 OpenSSL 1.1.1f 的官方源码压缩包,面向需要在 Linux、Unix 等平台自行编译部署安全通信组件的开发者与服务器运维人员,用于解决系统自带版本偏旧、需按项目需求定制加密库与命令行工具的问题。包内为完整的 C 源码工程&#…

📰

AutoX:基于QuickJS的安卓端侧JavaScript自动化框架

1. 项目概述:这不是“安卓版JavaScript”,而是一套可落地的端侧自动化工程实践“AutoX终极指南:在安卓上使用JavaScript实现自动化操作的完整教程”——这个标题里藏着三个极易被误解的关键点:“AutoX”不是某个官方SDK&#xff0…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬