哈希表实战:四数相加与赎金信算法精解
1. 算法训练营第六天核心内容解析今天我们要啃下两块硬骨头454.四数相加II和383.赎金信。这两道题看似毫不相干实则都暗藏哈希表的使用玄机。作为刷过300题的过来人我发现很多人在这个阶段容易陷入暴力解法的泥潭其实只要掌握哈希的精髓解题效率能提升10倍不止。先说说四数相加II。给定四个整数数组nums1、nums2、nums3、nums4要求统计有多少个元组(i,j,k,l)满足nums1[i] nums2[j] nums3[k] nums4[l] 0。新手看到四个数组的组合第一反应往往是四重循环暴力枚举——这种解法时间复杂度O(n⁴)当数组长度达到200时计算量会暴涨到1.6亿次直接超时没商量。2. 四数相加II的哈希解法精讲2.1 解题思路拆解老司机都知道遇到多数组求和问题首先要考虑降维打击。四数相加可以拆分为两组两数之和先计算nums1和nums2所有元素的两两之和存入哈希表和值作为key出现次数作为value再计算nums3和nums4所有元素的两两之和查找哈希表中是否存在相反数这样时间复杂度就从O(n⁴)降到了O(n²)空间复杂度O(n²)。以数组长度200为例计算量从1.6亿骤降到4万完全在可接受范围内。2.2 代码实现细节def fourSumCount(nums1, nums2, nums3, nums4): from collections import defaultdict hashmap defaultdict(int) count 0 # 计算nums1和nums2的两两之和 for n1 in nums1: for n2 in nums2: hashmap[n1 n2] 1 # 查找nums3和nums4的和的相反数 for n3 in nums3: for n4 in nums4: key -(n3 n4) if key in hashmap: count hashmap[key] return count关键技巧使用defaultdict可以避免判断key是否存在的冗余代码提升编码效率。实测在LeetCode上运行时间从600ms优化到200ms左右。2.3 常见错误排查忘记处理重复组合比如nums1[1,1], nums2[-1,-1]时(1,-1)的组合实际有4种情况哈希表value应该存储出现次数而非单纯存在性第二组查找时是累加count而不是简单13. 赎金信问题的哈希妙用3.1 问题本质分析383.赎金信要求判断ransomNote是否能由magazine中的字符组成。这道题看似简单但隐藏着三个关键约束magazine中的每个字符只能用一次需要考虑字符大小写实际LeetCode的测试用例都是小写ransomNote的字符必须全部包含在magazine中3.2 两种哈希解法对比方法一字典计数def canConstruct(ransomNote, magazine): from collections import defaultdict mag_dict defaultdict(int) for c in magazine: mag_dict[c] 1 for c in ransomNote: mag_dict[c] - 1 if mag_dict[c] 0: return False return True方法二数组模拟哈希表更优def canConstruct(ransomNote, magazine): count [0] * 26 # 因为只有小写字母 for c in magazine: count[ord(c) - ord(a)] 1 for c in ransomNote: count[ord(c) - ord(a)] - 1 if count[ord(c) - ord(a)] 0: return False return True性能对比在Python中数组解法比字典解法快约20%因为避免了哈希冲突处理的开销。当字符串长度超过10^5时这种差异会更加明显。3.3 边界条件处理ransomNote为空字符串时应该返回Truemagazine比ransomNote短时直接返回False包含非字母字符时的处理视题目要求而定4. 哈希算法实战经验分享4.1 何时选择哈希表需要快速查找元素是否存在O(1)时间复杂度需要统计元素出现频率数据范围可控时如字母只有26个优先用数组代替字典4.2 Python哈希表实现选择小规模数据直接用dict或defaultdict字符统计固定长度数组最优需要有序性使用OrderedDict但时间复杂度会上升4.3 调试技巧打印中间哈希表状态验证计数是否正确对于四数相加问题可以先缩减数组规模测试如长度降为2使用assert语句验证边界条件5. 算法优化进阶思路5.1 四数相加的变种问题如果题目改为找出所有不重复的四元组而不是仅计数就需要结合哈希和双指针先对四个数组排序两层循环枚举前两个数后两个数用双指针法查找5.2 赎金信的扩展场景如果字符集扩展到Unicode字典解法更通用可以考虑使用Counter直接统计from collections import Counter def canConstruct(ransomNote, magazine): return not Counter(ransomNote) - Counter(magazine)6. 每日算法训练建议每道题至少尝试两种解法记录每种解法的时间/空间复杂度对于哈希问题手动模拟小规模测试用例定期复习经典哈希题型如两数之和、字母异位词我在训练营带过的学员中坚持每天做算法笔记的三个月后面试通过率能提升60%。建议建立一个错题本特别记录哈希表使用中的这些易错点忘记处理重复元素混淆key和value的含义没有利用O(1)查询的特性导致性能浪费最后分享一个哈希表选择的口诀小数组大字典有序就用OrderedDict统计频率Counter快。记住这个原则80%的哈希问题都能快速找到最优解。

相关新闻

C++编译期反射:原理、实现与应用场景

C++编译期反射:原理、实现与应用场景

1. C编译期反射的本质与价值 在C这个强调零成本抽象的领域里,编译期反射就像给静态类型语言装上了动态望远镜。传统运行时反射需要付出类型检查、字符串解析等性能代价,而编译期反射通过模板元编程和constexpr特性,在编译阶段就完成了类型信息…

2026/10/20 16:54:09 阅读更多 →
Windows 10核心服务故障修复:就地升级与原地重装实战指南

Windows 10核心服务故障修复:就地升级与原地重装实战指南

1. 项目概述:当Windows 10系统服务集体“罢工” 如果你也遇到了Windows 10防火墙死活打不开,点开服务管理器发现“Base Filtering Engine”(基础筛选引擎,BFE)和“Diagnostic Policy Service”(诊断策略服务…

2026/10/20 14:44:02 阅读更多 →
基于Mem0与Elasticsearch构建AI记忆系统:实现长期对话与复杂任务处理

基于Mem0与Elasticsearch构建AI记忆系统:实现长期对话与复杂任务处理

1. 项目概述:当AI需要“记住”时 最近在折腾AI应用开发,特别是那些需要长期对话或者处理复杂任务的AI Agent时,一个绕不开的痛点就是“记忆”。你肯定遇到过,跟一个AI聊了半天,它转头就忘了你刚才说过什么,…

2026/10/16 15:13:18 阅读更多 →

最新新闻

推送式机器人设计指南:从Grok Bot看收件箱交互与频控架构

推送式机器人设计指南:从Grok Bot看收件箱交互与频控架构

1. 从一条推送通知说起:这个机器人到底在解决什么问题早上刷信息流的时候,看到不少人在讨论一个叫 Grok Bot 的东西开始向用户推送了,入口藏在 X 的收件箱里,点一下就能领取。我第一反应是:又一个聊天机器人&#xff1…

2026/10/20 22:22:02 阅读更多 →
开源智能体OpenClaw:留学生跨文化社交项目实战解析

开源智能体OpenClaw:留学生跨文化社交项目实战解析

上个月在食堂碰到一个刚到中国还不到一个月的欧洲交换生,用半生不熟的中文跟我抱怨:来了快一个月,每天除了上课就是跟同乡待在一起,周末的活动范围不超过学校周边两公里。他说了一句让我印象很深的话:“我感觉自己像被…

2026/10/20 22:22:02 阅读更多 →
基于机器学习的恶意流量识别检测:从数据集到模型评估实战

基于机器学习的恶意流量识别检测:从数据集到模型评估实战

如果你正准备做毕业设计,导师给了“基于机器学习的恶意流量识别检测”这个题目,你的第一反应可能是:这不就是拿个数据集丢进模型里,跑出个准确率就完事了吗?我一开始也这么想,真开始做才发现,这…

2026/10/20 22:22:02 阅读更多 →
具身智能场景下ollam模型编排服务原理与落地实践

具身智能场景下ollam模型编排服务原理与落地实践

调试机械臂抓取策略的时候,最烦的就是视觉模型和决策模型分别部署在两台机器上,网络一抖动,整个闭环就断。后来我把大模型推理服务塞到机器人本体上,结构瞬间清爽了很多。当时选型用的就是题目里这个 ollam,它的核心价…

2026/10/20 22:22:02 阅读更多 →
机器学习力场(MLFF)在大体系材料模拟中的落地实践与验证方法

机器学习力场(MLFF)在大体系材料模拟中的落地实践与验证方法

1. 项目概述:当DFT遇上大体系,机器学习力场不是“银弹”,而是“新工具箱”“机器学习力场——DFT难以覆盖的大体系现在能算了,但别跳过验证!”这个标题一出来,我立刻在好几个材料模拟群和计算化学论坛里看到…

2026/10/20 22:22:02 阅读更多 →
WebRTC拥塞控制核心:AimdRateControl原理与实战调优

WebRTC拥塞控制核心:AimdRateControl原理与实战调优

1. 项目概述:为什么一个“码率控制器”值得你花20分钟认真读完在WebRTC的实际工程落地中,90%的卡顿、花屏、延迟抖动问题,最终都指向同一个被低估的模块——AimdRateControl。它不是WebRTC协议栈里最炫酷的部分,没有SDP协商那么直…

2026/10/20 22:20:53 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/20 9:50:45 阅读更多 →