
力扣算法题集合这几个字说简单也简单说复杂也复杂。不少朋友一进力扣就对着题库发呆两千多道题到底怎么刷网上推荐这推荐那结果收藏了一大堆最后连一道都啃不透。我这些年折腾下来最大的体会是真正值钱的不是刷了多少道而是你有没有一套属于自己的算法题集合——把题按题型、优先级、考点组织起来让每一道题都能在你需要的时候被调出来用。这篇文章就围绕怎么构建并吃透这样一套力扣算法题集合来展开适合准备面试的、打算系统打基础的朋友。1. 为什么把力扣题拼成集合而不是按题号一路刷1.1 两千多道题普通人不可能全刷更没必要力扣目前有超过两千道题目而且每周还有周赛加新题。从题号一路刷下去是最不理智的做法早期题号偏简单中期题目质量参差不齐到了后期很多题都是周赛难度的高阶题刷得你怀疑人生。我见过太多人立flag从第1题刷到第2000题坚持到两三百道就崩了。真正该做的是把题库当作一个原料库按自己的目标重新组织。这里的目标说白了就是两类一类是面试算法关要过另一类是竞赛想提升。对绝大多数人来说第一类目标就够了。如果奔着面试去你需要的不是全题量而是一份覆盖核心考点、按题型分类、标注优先级的题组。这个题组才是真正属于你自己的算法题集合。1.2 三种常见的组织方式我为什么选按题型优先级双维度市面上的刷题集合有三种组织逻辑。第一种是按难度分简单、中等、困难各来一波第二种是按数据结构和算法专题分数组、链表、树、动态规划分门别类第三种是按公司面试频率分什么字节高频“微软高频”。三种我试过不少最后稳定下来的是以专题为主轴在专题内部再按优先级排序。为什么这么搭纯按难度分的问题在于中等难度的跨度太大动不动就掉进DP和状态压缩的坑新手根本分辨不出哪些该先做。纯按公司频率分的问题在于题目变化太快而且容易让你产生背题心态。按专题来你每次只练一个知识点的输入和输出大脑能建立清晰索引。而优先级这个东西解决的是储备量的问题P0题必刷必会P1题尽量吃透P2题有余力再做。1.3 我给题目定优先级的判断标准我对一道题是否纳入集合重点看三件事。第一这道题是不是某个考点的基础原型。比如两数之和一题吃透哈希表的本质这种必须P0。第二这道题是否能引申出变形。比如反转链表迭代会了还要会递归还会引出反转区间链表这类升级题这种价值极大。第三这道题在面试中是否常见。面试官不会考你偏门题他考的一定是能快速验证候选人编码能力和思路的题型这类题必须收进集合。反过来只靠暴力枚举硬过的题、纯考数学技巧没有通用性的题、需要背高级模板才能写的题我一律不建议放太高优先级。这个过滤动作其实比刷题本身还重要它能帮你省下一大把时间。2. 集合里的核心板块题型地图与必刷清单2.1 基础四板斧数组、字符串、双指针、哈希表任何一个合格的力扣算法题集合开篇必然是数组和字符串。这两个结构看起来没难度但背后牵扯出的算法其实很丰富。数组考的常常是索引管理和区间处理字符串考的是遍历边界和模式匹配。数组这里我必入集合的有二分查找的经典题如搜索插入位置、移除元素、盛最多水的容器。二分查找别看简单它其实是面试里最容易出细节问题的题型左右边界怎么取、while条件是小于还是小于等于、中间值怎么更新全是坑。双指针则是把O(n^2)优化成O(n)的神器五道题练下来你就能形成条件反射。哈希表建议和数组放一起练因为哈希表最经典的应用场景就是把查找一个数是否存在从O(n)变成O(1)。两数之和是祖宗题后面还有字母异位词分组、最长连续序列。我自己的体会是哈希表的题目不要在去重上死磕重点是理解键该怎么设计很多难题的突破口全在键的构造上。2.2 数据结构专项链表、栈与队列、树链表这块面试常考且套路固定。反转链表、环形链表、合并两个有序链表是三道必收题。不过链表题有个特点代码量不大但指针操作一多就乱。所以我的建议是链表题必须白板推演一遍不能只看题解觉得自己会了。每次操作前必须搞清楚当前指针指到哪了下一个节点还能不能访问到这两点想清楚了链表题就通了一半。栈与队列的特点是最近相关性和先进先出绝配场景是括号匹配、单调栈。单调栈是我特别想强调的点它在下一个更大元素接雨水柱状图中最大的矩形这类题目里一波接一波出现。单调栈理解的难点在于什么时候弹栈以及弹栈时在计算什么这两个点想明白了这类题能一口气解决。树是数据结构里的重头戏。二叉树的遍历前序、中序、后序、层序是基础中的基础但要真正做到能默写、能改递归为迭代是需要刻意训练的。树题的核心不只是遍历本身而是对遍历顺序的利用中序可以验证二叉搜索树后序可以处理子树信息前序可以复制树结构。所以树这个板块做深了你后面做动态规划里的树形DP会非常顺。2.3 算法专项回溯、动态规划、贪心这三个算法是面试题的高端区也是很多人崩溃的地方。先说回溯。回溯本质上是一个带状态重置的DFS它的模板非常固定递归入口、终止条件、路径选择、撤销选择。比较有代表性的题包括全排列、组合总和、N皇后。回溯题只要套模板框架就不会错难点在于剪枝条件和去重逻辑这个只能靠多写题找感觉。动态规划是重灾区。但是动态规划其实也是分层级的记忆化搜索、自底向上递推、状态压缩、树上DP、区间DP。我的建议不是一上来就刷困难DP题而是先把爬楼梯打家劫舍最长递增子序列这三道搞到滚瓜烂熟。这三个题分别代表了斐波那契型DP一维状态DP序列型DP三个基础模板把这些弄熟练再上零钱兑换最长公共子序列这类题才不容易崩。贪心算法看着简单实际是证明最难。区间调度类的题是最经典的贪心入门面试里也高频出现比如无重叠区间、用最少数量的箭引爆气球。贪心的题难在你要敢猜、还得能找到反例。我的经验是贪心题不适合死磕证明反而适合用举反例的方式来验证找到一个反例就说明这个贪心思路不对换方案。2.4 一份供直接抄走的题型主清单我把上述内容整理成一张表按板块、必收题目、核心考察点来列方便你直接建立自己的刷题集合骨架。表里的题不是越多越好而是每列一个都对应一个高频面试考点建议每道都按P0来对待。板块必收题目核心考察点数组二分查找、搜索插入位置、移除元素二分边界、双指针覆盖哈希表两数之和、字母异位词分组、最长连续序列键设计、空间换时间双指针盛最多水的容器、三数之和、移动零对撞指针、O(n)优化链表反转链表、环形链表、合并两个有序链表指针操作、迭代与递归栈与队列有效的括号、每日温度、柱状图中最大的矩形栈的特性、单调栈二叉树二叉树中序遍历、最大深度、验证二叉搜索树递归与迭代、遍历顺序回溯全排列、组合总和、子集状态重置、剪枝动态规划爬楼梯、打家劫舍、最长递增子序列递推公式、状态定义贪心无重叠区间、分发饼干、跳跃游戏贪心策略、反例思维这张表只是起点拿到之后你可以按自己的薄弱项横向扩展。比如二叉树弱那就把翻转二叉树路径总和最近公共祖先补进去形成一个树升级专题。集合是动态的不是一次定死。3. 语言选型Python和Java怎么选、怎么配3.1 Python做题优势快、短、思路不容易被打断很多人纠结刷题到底用Python还是Java我的看法是不要纠结先想清楚你的目的。如果目的是快速过思路、验证算法正确性那Python是第一选择。Python的代码量大概是Java的1/3左右内置数据结构又非常友好。字典实现哈希表列表自带栈和队列功能heapq直接支持堆操作字符串处理也是Python的强项。用Python刷题的时候你几乎可以把全部注意力集中在算法逻辑上而不是花时间写无关的模板代码。还有一个隐藏好处Python写出来的代码很好检查。变量命名直白、缩进清晰、列表推导式可读性高复盘的时候扫一眼就能回忆思路。对一个刷题人来说能快速回顾是非常重要的体验Python在这方面完胜。3.2 Java做题优势类型严格、贴近企业工程环境如果你的目标是大厂后端面试那Java也得会。面试时很多候选人习惯用Python解题这没问题但Java在明确性和工程性上有天然优势强类型让你在写代码时就能发现类型错误Java集合框架完善Map、List、Deque都有非常清晰的方法名可用。Java刷题的一个隐形训练价值在于你被迫把过程写得更明确。比如栈操作用LinkedList还是ArrayDeque队列用LinkedList还是PriorityQueue这些都是工程化思考。用Java做过一段时间题之后你写生产代码的时候对复杂度的敏感度会比只用Python的人高不少。3.3 我的推荐方案一题两语言双通道记忆我自己常用的做法是新题先用Python快速过思路和正确性写通之后再尝试用Java实现一遍。这样一道题被拆成两层——第一层打磨算法思维第二层强化工程能力。虽然花费时间会多一倍但对知识点的留存度极高。具体操作上我建议Python代码放在题解笔记的思路区附近Java代码放在实现区让两份代码形成对照。时间不够时至少保证大题型的第一道P0题两语言都写后续同类题只写PythonJava靠思维上过一遍。4. 实操从零搭建一套可复用的力扣刷题集合4.1 仓库结构怎么搭文件怎么命名我强烈建议给算法题集合建一个独立仓库。这不是让你开源是让你自己维护。仓库结构按题型-题目两级目录来组织比如这样01-array/02-linked-list/03-stack-queue/04-hash-table/05-binary-tree/06-backtracking/07-dynamic-programming/08-greedy/09-two-pointers/10-binary-search/每个目录里每道题建一个独立文件。文件命名推荐用数字序号题号题干关键词比如01-LeetCode-001-two-sum.md。不要用1.md这种裸命名时间一长根本想不起是哪题。文件内部固定一个模板至少包含四块问题描述、解题思路、复杂度分析、代码实现。README我做成了索引表格式很简单题目 | 难度 | 是否完成 | 核心思路 | 易错点。这个索引表的价值在于你刷完几百道之后能一键看到自己的知识网络图全貌。哪个题型薄弱、哪道题还没吃透一目了然。4.2 三道经典题的全流程拆解示范我拿三道基础到不能再基础的题来演示一遍怎么往集合里沉淀分别是两数之和反转链表爬楼梯。第一道两数之和。题目要求在一个数组中找到两个数使它们的和等于目标值。人肉找当然容易但要让机器高效找核心思路就是用哈希表存当前值期待匹配的值。遍历每个数时先检查目标值减去当前值是否已在哈希表里有就直接返回没有就把当前值的补数存进表。时间复杂度O(n)空间复杂度O(n)。这道题的易错点是先查再存还是先存再查。必须先查再存否则遇到类似target6、当前数3的情况会在遍历第一个3的时候就从表里找到自己导致错误的配对。这个细节非常经典值得写进笔记的易错点里。第二道反转链表。迭代法的核心是三个指针prev、curr、next。每次先把next保存下来然后让curr.next指向prev接着prev移动到currcurr移动到next循环到链表尾部。边界条件是链表为空或只有一个节点直接返回head。这道题我想强调的点是递归解法。递归反转头节点的递归关系是让后一个节点指向前一个节点。很多初学者死活看不明白递归我的建议是不要在脑子里展开递归栈只盯当前这一层干了什么、递归返回了什么两个问题。刷题集合里的笔记我通常同时记录迭代和递归两种写法面试官大概率会追问另一种实现准备两套解法很有必要。第三道爬楼梯。每次可以爬1或2个台阶问爬到楼顶有多少种不同方法。这个题是动态规划最经典的入门——走到第n阶的方案数等于走到第n-1阶的方案数加爬到第n-2阶的方案数。状态转移方程式写出来是dp[n] dp[n-1] dp[n-2]初始值是dp[1]1、dp[2]2。这个题不算难但它牵扯出一个重要考点空间优化。既然dp[n]只依赖前两个值就不需要维护整个数组用两个变量滚动更新就够了。从O(n)空间优化到O(1)空间这个过程本身就在培训你的优化思维。所以每题做完我都会记一笔是否有滚动数组/原地修改的优化空间这个习惯让我后面啃DP难题时少踩很多坑。4.3 题解笔记的复盘节奏题写完了集合里还要有复盘环节。我指的复盘不是写过一遍就完而是隔天、隔一周再回来看一眼。怎么复盘直接看索引表的易错点列看到哪一条不能在3秒钟内反应出完整的处理方式就去翻对应题目的笔记重读。还有一个提高留存率的动作把不同题型的相似思路串起来。比如两数之和的哈希表思路和最长连续序列的去重起点检测思路本质上都在用空间换时间。我笔记里专门开了一节叫跨题联动记录这种看似不相关但底层思想相同的题目组合。时间久了你的算法题集合就从题目的仓库变成了思路的网络。5. 常见问题与排查心得5.1 刷了很多题还是不会做卡在哪了这是被问得最多的一个问题。我观察下来卡住的人通常不是缺题量而是缺题型归因能力。他们做题的时候看到的是题目表面而非考点本质。比如看到数组就想着排序看到字符串就想着遍历却没有联想到这题到底在考哪个结构性方法。我自己的化解办法非常朴素做完一道题必须能用一句话说出这题在考什么。说不出来说明这题没有真正入脑。然后隔段时间再遇到类似题先问自己我是否见过这个考点再去回忆对应解法。这样刷题就不会出现似曾相识但做不出来的挫败感了。5.2 遗忘速度极快前几天刷的题过几天就懵遗忘太正常了人的大脑就是这么设计的不用自责。真正要解决的是怎么把遗忘曲线利用起来。我的做法是给集合里的题安排三轮复习周期第一天学习第三天复现第七天再复现。复现的时候不能翻笔记直接在编辑器里重新写一遍。写不出来的才是你真正不会的题标记上进入下一轮复习。这里有个容易被忽视的点复习要优先复习接近回忆起但还没完全回忆起的题。难度过高、完全想不起来和难度过低、一眼就会的题都不适合安排在当下复习。前者打击信心后者浪费时间。这个提取强度的判断就是你复盘时的主要工作。5.3 只抄题解不写代码看着答案觉得简单一动手就废看题解和写代码之间的距离远比你想象的大。题解把思路和结论梳理得明明白白你看的时候觉得自己懂了但从看懂了到能独立写出来之间还隔着十次左右的代码手误和边界判断。我的建议是一道题至少独立写两遍。第一遍空着编辑器写卡住时可以瞄一眼题解但要记录卡在哪一步。第二遍要闭卷写写完后和自己第一遍对比检查是否还存在同样的卡点。如果第二遍顺利这道题才算初步入账。5.4 刷题时间安排总被打乱坚持不下去刷题最怕的不是难而是断。如果每天固定两小时刷题做不到那就改成每天至少20分钟。20分钟你可以做三件事回顾两道已刷题的易错点、手写一道算法题的框架、分析一道新题的考点归属。千万别小看这20分钟刷题的核心是保持手感而不是单次时长。还有一个实用的技巧把刷题和你的日程绑定。比如早上到工位顺手做一道哈希表小题下午下班前再花20分钟复盘。碎片时间适合做回顾型任务和轻量新题整块时间留给链表、动态规划这类需要沉浸思考的题型。这样安排即使再忙你也能保证刷题集合里每天都有一点增量。6. 给不同阶段朋友的组合建议6.1 时间紧张的求职者只盯面试最高频题如果你下个月就要面试别贪多。这时候的目标只有一个把中等难度题的解题模板练到手熟。我建议你只刷集合里的P0题数量控制在60到80道左右每道题至少覆盖一类独立考点。然后按题型做横向复习不要按题号做纵向刷题。面试中大厂的常见套路就是考基础题型的变体模板练熟了变体也能拆解。这个阶段还要做一次白板模拟。做题时不允许用IDE的自动补全手写代码要能一遍通过。面试考的不只是正确性还有节奏感和代码风格雀食每天留半小时做这种模拟面试比多刷二十道新题管用。6.2 在校学生打基础以专题全面推进为主学生时间相对充裕我建议按题型图谱全面展开。每接触一个新题型先看基础概念再做三道同题型的P0题最后尝试一道P1变形题。这样每个板块既有存量又有增量。同时我特别建议参加周赛周赛的题虽然偏难但能逼你写出时间压力下的代码。哪怕只做出一题也比平刷三道题更有训练价值。这个阶段的集合要记得维护知识盲区清单。每次周赛或专项练习做不出来的题都丢进这个清单每两周回头清一次。所谓基础扎实不是把容易题刷一百遍而是把盲区里的困难题从陌生磋磨到熟悉。6.3 已入职场想保持手感做精做深重质不重量工作之后没有大块时间刷题适合做精选题专项。我最推荐把集合里最经典的三类反复练手写二叉树四种遍历、手写链表经典操作、手写常见DP转移方程。这类题代码量小、考点密集非常适合碎片时间复现。另外这类朋友很容易陷入我全都会只是手生的错觉。我的破解办法是定期随机从集合里抽题给自己限时15分钟写到跑通为止。随机抽才能暴露不熟悉的部分也能防止你在舒适区里原地踏步。维持一个手感题池每次抽5道这五分钟就是最划算的算法投资。说回力扣算法题集合这件事本身我最想分享的心得其实是集合不是题库的快照而是你算法认知的投影。一开始它是知识点列表后来它会变成考点网络到最后它会变成你解题时的直觉。我见过不少人从力扣两千题里走出来最后沉淀成几十道精练题的集合反而面试状态最好。少即是多把题做穿比把题做多值钱得多。如果你正处在选型或者起步阶段别急着开刷先把属于自己的那份集合框架建起来后面的路会顺畅很多。