算法刷题Day1:从哈希表到双指针,建立高效解题思维框架
我最早关注到“灵神”这个名字是因为一道排序题的解法和官方题解完全不同边看边拍大腿原来算法还能这么拆。后来我养成了一个习惯每天花四十分钟跟着灵神系列刷题两个月下来从“看题发呆”变成“看到题能条件反射地分析复杂度”这是我学算法以来变化最大的一段经历。这篇就当作我的Day1复盘把第一天真正该做的事、该避的坑、该搭的框架从头到尾讲清楚。这篇内容不只是记录我个人的刷题打卡更想给那些和曾经的我一样——收藏了一堆题单、买了书、却始终卡在“不知道从哪里开始”的人一套可以直接照做的Day1执行方案。我会告诉你第一天为什么不应该急着刷难题、怎么选前几道题、遇到卡壳该怎么处理、以及如何把一天的成果变成可以复用的“算法笔记”而不是刷完就忘。1. Day1为什么是整条学习曲线的生死线1.1 大多数人的刷题失败不是败在难度而是败在启动方式我见过太多人包括我自己是这样的心血来潮打开题单第一题就是一道中等难度的动态规划然后花了三个小时看题解看完觉得自己懂了合上屏幕第二天全忘了。第三天再打开发现还是不会挫败感直接拉满于是放弃。这个模式几乎可以预测。问题不在于你笨而在于Day1的启动回馈太差。人的大脑天生喜欢即时反馈你第一天就怼一个需要两小时才能勉强看懂的题等于给自己设置了一个极高的挫败阈值。学习算法不是靠意志力硬撑的而是靠每个小胜利滚出惯性。灵神在讲题时经常说一句话大意是你能做出来的题才会变成你的能力你看懂的题只是你的幻觉。这句话放在Day1尤其适用。所以Day1的第一原则不是挑战难题而是制造连续的正反馈。你要让大脑在第一天结束的时候产生“我好像有点会了”的感觉这种感觉才是第二天继续打开编辑器的动力来源。1.2 灵神式学习法的核心把“看懂”变成“做出来”我看灵神的系列讲题最大感触是他几乎从不直接丢答案。他会先花五分钟讲清楚题目在问什么再带你从最朴素的暴力解法出发一步步推导到更优的解法。这个过程给我一个很大的启发算法不是记忆的比拼而是推理的复现。很多刷题教程的问题在于它给你的是“鱼”而灵神给的是“渔”的全过程但即便如此如果你只看视频不动手依然只能停留在“被喂”的状态。我的Day1实操体会是看懂一道题的题解只算完成了10%真正的掌握是把题解合上自己从零开始写出能通过的代码并且能解释清楚每一步为什么那样写。因此Day1的最高优先级不是知识的输入量而是找到一个能让你“完整做出几道题”的起点。这就像学游泳你第一天不需要学会自由泳换气你需要的是敢下水、能扑腾几下不呛水这个安全感建立起来后面的进阶才有基础。1.3 Day1的结果衡量标准不是“刷了多少题”而是“建立了几个行为习惯”我建议每个人在Day1结束时问自己三个问题我今天有没有不看题解、独立写出一道题的完整代码我有没有把今天学到的东西记录成可回顾的笔记我明天是否知道具体要做什么而不是“有空再刷”这三个问题分别对应动手能力、总结能力、计划能力。它们才是算法学习长期有效的底层框架。我见过一个同学就说A同学吧Day1给自己定的目标非常小只做一道“两数之和”的变体题但要求自己用三种方法各写一遍然后写一篇两百字的思路笔记。他坚持了三个月效果比那些一天刷十道题但从不复盘的人好太多。所以这篇Day1文章我不会给你一个长长的题单而是会给你一套可执行的最小启动包三道热身题、一个刷题流程模板、一个笔记模板、一组应对卡壳的规则。把这些跑通你的Day1就已经赢过了大多数人。2. 三道热身题为什么是从排序和双指针开始而不是动态规划2.1 选热身题的第一原则题目必须对应一个“你已经见过”的通用方法不少人的Day1选题逻辑是反的先挑一个难的知识点然后去搜题。正确的做法应该是反过来先确认自己今天要练的“招术”再选一道刚好需要这个招术的题。灵神系列最常强调的入门招术有三个排序加双指针、哈希表空间换时间、递归转迭代。这三招覆盖了大量基础题的解法而且理解它们的门槛不高非常适合作为Day1的训练内容。我给你的三题组合是这样的顺位招术典型题特征要练到的能力第1题哈希表查重找数组中是否有两个数满足某条件空间换时间的思想第2题排序双指针数组元素两两配对找特定和/差有序性如何简化问题第3题迭代替换递归按照固定规律遍历/生成序列从问题的“结构”切入这三道题的共同特点不需要任何前置知识只要会写最基础的循环和条件判断就能动笔。它们不像“二叉树层序遍历”那样需要先理解队列也不像“最长回文子串”那样需要动态规划铺垫。2.2 第1题哈希表不是“高级技巧”而是“更快找朋友”第一道题我建议选“两数之和”的任意变体。因为这道题是整个算法世界最经典的“空间换时间”教学案例。我第一次用暴力双层循环解它的时候觉得已经很厉害了后来看灵神的视频才意识到这道题真正的教学价值是让你体会“为什么可以用额外空间省掉一层循环”。暴力法双重循环遍历所有组合时间复杂度O(n²)。这个过程你得去查一个元素是否出现过每次都要遍历。哈希法用一个map存下已经见过的数字和它的位置。遍历到当前数字的时候只需要查询目标差值在不在map里。时间复杂度O(n)代价是额外O(n)空间。这背后是一个极其重要的算法直觉很多时候时间不够用空间来凑。这也是为什么面试和工程中“缓存”这么常见。哈希表就是缓存思维最简单的一种体现。Day1就把这个直觉种下去后面学动态规划、记忆化搜索的时候你会发现它们的内核一脉相承。2.3 第2题排序双指针是“暴力枚举”的去重升级版第二道题我建议选一道“排序后找两数之和”的题。这类题目的核心是如果数组是无序的你只能枚举但如果先排序就能用双指针从两端向中间逼近把复杂度从O(n²)降到O(n)。我第一次看双指针的时候觉得这招简直是魔术两个指针一个从左边走一个从右边走根据当前和的大小决定移动哪边几轮就找到了答案。实际上背后的逻辑非常朴素——数组有序之后左指针往右意味着“和变大”右指针往左意味着“和变小”你可以像用天平一样去逼近目标值。Day1做这道题是为了建立“先排序再想办法”的思维习惯。因为大量的问题在无序状态下看起来非常复杂一旦有序规律就浮现了。这个思维习惯后面学区间合并、滑动窗口、二分查找都会反复用到。学算法不是学一道题的解法而是学一堆“先做什么能让问题变简单”的套路。2.4 第3题用循环模拟递归理解“递归的本质是栈”第三题我会选一道结构上带递归特征、但可以用循环直接做的题。比如“按照某种规则生成序列”的题目。这类题你通常能轻松地写出递归版本但Day1的加练项是尝试用一个循环、一个临时变量把递归改成迭代。这个练习的价值在于让你亲身感受递归不是玄学它依赖于系统栈保存每一层的状态。当你自己手动用一个变量去保存“上一轮的状态”你就真正理解了递归为什么能工作以及什么时候递归可能导致爆栈。三道题做完你对“算法题在考什么”的认识就从“拼记忆力”变成“拼思维模型”哈希表是空间换时间、排序是化简问题的利器、递归是由系统栈支撑的过程归约。这三个模型基本可以覆盖Day1之后一周内你遇到的所有题。3. 一套可落地的Day1刷题流程从读题到复盘的固定动作3.1 第一件事先给自己定一个“最小完成量”我强烈建议你在Day1开始前就写下三个数字今天做几题、每题最长思考多久、今天最少写多少行代码。这三个数字必须小到让你觉得“不难”为止。对于完全没有基础的人我的建议是做23题而不是810题独立思考最长15分钟而不是死磕1小时最少手写50行代码而不是必须写完一道完整的大题。这三个数字的目的是把“完成”的标准降低到可触碰的高度。你可能会觉得这太轻松了但请相信Day1的核心是保住“做完了”的感觉而不是“做得多”的虚荣。我认识一位从数学转码的同学他的Day1只做了半道题但因为把半道题彻底吃透他后来的学习加速度明显快于旁边那位一晚上啃完五道题但转头就忘的朋友。3.2 单题流程十分钟读题、十五分钟思考、三十分钟复现这是我自己摸索出来后来发现和灵神推荐的节奏高度一致的单题执行流程。第一步读题。用510分钟把题目读三遍重点不是看懂样例而是把三样东西圈出来输入的形式、输出的要求、以及数据规模。数据规模特别重要因为它直接提示你这道题能接受的复杂度范围。比如n ≤ 10⁵的题目基本不用考虑O(n²)的暴力解n ≤ 20的题目反而可以大胆用回溯暴力。这一条规则比你记一百个模板都实用。第二步独立思考。计时15分钟在这段时间里你能想到多少算多少过程可能很痛苦但这个痛苦是有价值的。我Day1学到的一个重要感悟是思考时的那种“卡住感”恰恰是大脑建立神经连接的时机。你卡住一个小时和卡住十五分钟神经连接和肌肉训练是完全一样的唯一的区别是后者不会让你崩溃。第三步看题解并复现。看题解不是让你从头看到尾而是看到“思路一半”的位置比如看到“这题可以用哈希表”就停然后自己继续写。如果写不出来再往回看一点点直到能独立写出通过所有用例的代码为止。最后一步是测试尝试造一两个边界输入去验证比如空数组、只有一个元素、全是重复值的数组。这个习惯会伴随你整个算法学习周期越早建立越好。3.3 卡壳时的三条处理规则别让死磕毁掉节奏没有谁能保证每道题都顺畅通过Day1尤其会卡。我给自己定了三条规则后来也推荐给身边的朋友。规则一连续两次看题解仍无法复现立刻换题。说明这道题当前超出了你的能力区硬啃只是浪费时间。把它记到待办清单两周后再回来。规则二累计思考超过45分钟还没有任何头绪允许直接看题解但看完之后必须合上题解从零写一遍。只看不写等于没看这个道理我强调多少次都不嫌多。规则三看题解后仍然不懂说明问题出在“前置知识缺失”。比如你连“栈”是什么都不了解自然看不懂涉及栈的题的题解。这时候应该先退回去补前置知识而不是继续往下钻。Day1的选题已经刻意避开了这类问题但如果你的基础比预想还薄弱记住后退不是失败是策略。3.4 完整时间盒参考四十分钟高效启动模板我给出的Day1总时长可以压缩到40分钟也可以扩展到两小时看你自己的精力情况。下面是一份我实测有效的两小时模板时间段动作目标010分钟列出今天的目标、把三题先浏览一遍对全局有掌控感1050分钟第1题完整流程体验“从零到AC”的闭环5070分钟第2题独立思考和实现尝试不依赖题解7090分钟第3题拆解与写笔记体验“学一招用一招”90110分钟补全三题的代码模板、整理笔记产出可复用的资产110120分钟写一句话明日计划让Day2自动衔接注意这个表里的“第3题”可能不是你能完整做出来的它甚至可以是你看完题解后照写的。没关系Day1的终点不是“全都会”而是“全部接触”。只要每道题都在你大脑里留下一个“这类题可以用什么思路”的锚点就已经超额完成目标。4. 沉淀第一天的成果代码模板与算法复盘笔记怎么做4.1 为什么一定要做笔记而且笔记必须包含“错误路径”很多人觉得做笔记是浪费时间有这功夫不如多刷一道题。但我想问你一个问题你刷过的题两周后回来重做能一遍AC吗如果不能那你刷题时只完成了一半你得到了当时的AC却没有留下让未来的你能快速找回状态的钩子。我做笔记的习惯受灵神讲题的启发很大。他的每道题解都包含一个“朴素解法到优化解法”的演进路径这个路径其实就是他的“思考笔记”。我自己做笔记时也刻意保留这个结构先写我第一时间的暴力思路哪怕很笨再写最终的优化解法再写“两种解法之间到底差在哪一步”。这样做的好处是几周后回看笔记你能看到自己当时的思维起点而不只是看到一个答案。一个标准复盘笔记模板长这样# 题目xxx ## 日期Day1 ## 题型标签数组 / 哈希表 / 双指针 ## 我的初始思路 - 暴力双层循环O(n²) ## 卡在哪一步 - 没想到用map记录历史数据导致查询效率低 ## 优化解法 - 哈希表 一次遍历O(n) ## 关键启示 - “查询历史数据”优先想到哈希表 ## 明日计划 - 复习第2题的双指针写法这份笔记的精髓不是最后一个“关键启示”而是“卡在哪一步”。因为人的记忆特点是你对曾经卡住的地方的印象远比对顺滑通过的地方更深刻。把痛点记录下来未来复习时才能精准打击薄弱点。4.2 代码模板不是背题而是给自己搭脚手架除了复盘笔记Day1还应该做一件事把今天练过的数据结构操作整理成一个带注释的代码模板。比如你用了哈希表那就整理一个哈希表的创建、插入、查找、遍历的标准写法。这个模板不是让你背下来的而是当成“脚手架”下次遇到新题先打开模板把架子搭好再往里面填逻辑。以哈希表为例不同语言写法不同但核心逻辑一致。我用JavaScript方便演示// 哈希表模板统计数组中每个元素出现次数 const countMap new Map(); for (const num of nums) { // 如果哈希表里已有这个数出现次数1否则初始化为1 countMap.set(num, (countMap.get(num) || 0) 1); } // 遍历哈希表检查条件 for (const [key, value] of countMap) { if (value 2) { // 满足条件时的处理 } }这类模板整理多了你会慢慢发现算法题的核心不是在“写语法”而是在“选结构”。拿到一道题你脑子里最先冒出来的是“这题要用哈希表还是双指针”而不是“这个语法怎么写”。Day1就把这个筛选机制跑通后面会越来越顺。4.3 用“借书卡”代替“错题本”让笔记变成活资产传统的错题本要求你抄下错误代码、写检讨我试过又费时又打击自信。后来我换了一个思路把笔记当成“借书卡”每一次回看笔记就在笔记下面画一个杠表示“我又借了一次”。如果一道题被回看了三次以上说明这个知识点还没内化就把它单独列进重点清单每周重做。这个方法的心理优势非常明显你回看了三次说明你反复借这本书证明你很重视而不是在否定自己。而且它有量化效果你能清楚地看到哪些题是你真正反复需要巩固的哪些题看一眼就会可以直接归档。Day1结束的时候你的成果不是“刷了三道题”而是一份复盘笔记、一个代码模板、一个重点清单起点。这些东西会在Day2、Day3逐步形成体系最终成为你算法学习最宝贵的资产。很多人的笔记是写给老师看的我的笔记是写给我自己看的每一句都是给未来的自己留的路标。5. Day1最常见的五个幻觉与对应的打破方法5.1 幻觉一“看懂了题解就算学会了”这个幻觉我从最开始也有看灵神讲题觉得每一步都合理跟着推一遍好像真的懂了。但关上视频自己写的时候要么忘了初始化条件要么在处理边界时懵圈。后来我给自己定了一条铁律任何一道题看完题解后必须马上关掉所有参考独立提交一次AC了才算真正过一遍。没AC就说明刚才的“看懂”只是在跟着做题家的思路走不是自己的思路。打破方法看完题解后强制合上参考文件手写完整代码并且要求自己提交一次。如果你的编译器报错超过三次好说明刚才根本没看懂回头再看题解再合上再写。5.2 幻觉二“做的题越多进步越快”学习算法的真实曲线不是线性增长而是平台期-跃升期的螺旋。Day1你可能做三题就收获满满Day3做十题却什么都没记住。单纯堆数量很快会遇到瓶颈你刷的题都是“旧招术换新皮”实际训练不到新思维。打破方法每做一道题先问自己“这道题让我练到了哪个招术”如果答案和上一道完全一样就不算拓展如果答案不明确说明这道题已经超出了当前有效学习浓度停下来写笔记比继续刷更重要。灵神系列我观察下来它的题单都是按“专题”组织的而不是按“难度”堆叠的这就是在刻意制造“练招”而不是“数数”的节奏。5.3 幻觉三“第一天不搞懂所有原理就输了”我看过很多人做题时强迫症发作数组越界要弄明白底层内存分配、递归要弄到汇编级别、复杂度分析非要推导到数学公式。不是说这些没有价值而是在Day1这个阶段它们会严重拖垮你的启动速度。算法学习是倒过来生长的先用起来再深挖原理。就像你不知道CPU缓存的工作原理也能写出能跑的代码一样你先会双指针再慢慢理解为什么它能把O(n²)降成O(n)这个过程完全来得及。打破方法Day1允许自己“只知其然不知其所以然”。你在笔记里写“这道题用了排序双指针”这已经足够了。那些“为什么排序之后双指针可以工作”的问题记在“待思考清单”里一周内找答案。不要为了完美的答案牺牲执行闭环完成比完美重要。5.4 幻觉四“不按别人的题单顺序刷就学不会”现在的算法学习资源太丰富了随便一搜就有几十个刷题路线、几百个题单。每个题单的排序都不一样有人说先学数组有人说先图论。我见过最夸张的一位朋友Day1花了整整三天去对比各个题单结果一道题都没做。选哪个题单根本不重要重要的是你必须选定一个然后至少往下走两周。打破方法如果你不知道选哪套顺序就用最简单普遍的“数据结构为主线”的题单因为它的逻辑链最清楚数组→链表→栈→队列→哈希表→树→图→动态规划。选定之后Day1就按这条线的前两个节点来。记住一个平庸的题单执行到底胜过一个完美的题单只看了开头。灵神系列好就好在它帮你把“选哪一套”的时间省掉了你只需要跟着它的节奏每天按部就班即可。5.5 幻觉五“必须每天状态拉满才算合格”Day1特别容易让人打鸡血然后Day4就熄火了。我踩过的坑是第一天学了四小时第二天觉得太累休息了一天第三天再看已经完全不想动了。后来我调整了策略把标准从“每天学多久”改成了“每天写几行代码”哪怕只是一段双指针的模拟也算打卡成功。不要小看这个微小的标准转变它让你在疲惫时依然有资格说一句“我今天没有断掉”而连续不断的学习节奏比单次爆发重要得多。打破方法给自己设一个“保底模式”今天再累也要完成三件小事——打开编辑器、写十行代码、看一眼昨天的笔记。这个保底模式的执行成本极低却能锚定你每天的学习身份保证你不在Day2、Day3中断。我陪一些朋友做过这个尝试凡是能坚持保底模式的基本都能撑过第一个月凡是靠鸡血式爆发开始的多数都倒在了第47天。你信我养算法学习的习惯比你赌一次满状态重要一万倍。我个人的体会是Day1真正的成功标志从来不是那几道题写得多漂亮而是你在心里种下了一个清晰的认识我知道下一步该做什么而且我知道明天我会继续做。算法学习是一场漫长但极有规律的攀登第一天的意义不是冲出去一百米而是确认你有了一双合脚的鞋一条看得见的路线以及一个每天起床都愿意继续走下去的心情。希望你今晚关掉屏幕时心里想的不是“我好累”而是“明天再来一道试试”。