AlgoMooc

Hot100 ACM 训练 · 开放系列

把 Hot100 练成能提交的 ACM 手感

很多机试和笔试不是函数签名模式,而是要自己处理标准输入输出。这个系列把经典高频题改成 ACM 形式:先看图解动画理解思路,再回到 OJ 写完整读入、边界和输出。

100

开放 ACM 题

10

专题分组

19

简单题

74

中等题

我的进度

登录后记录你的通过进度

0%

题单

已开放 100 道,按专题把 Hot100 练成手感

每道题都能跳到图解动画,也能进入 OJ 直接提交;补满 100 道后仍按这套专题结构承载。

查看全部图解题库

数组与哈希

先练数组扫描、频次统计、前缀和与哈希表,把最常用的数据组织方式跑顺。

前置知识数组哈希表前缀和
专题进度0/14
01H100001LC 1

两数之和 ACM 版

把两数之和改成标准输入输出,重点练哈希表存已访问数字。

简单
数组与哈希数组哈希表
10H100010LC 169

多数元素 ACM 版

候选人抵消模型,练习 O(1) 空间的多数元素查找。

简单
摩尔投票数组摩尔投票
18H100018LC 560

和为 K 的子数组 ACM 版

统计前缀和出现次数,边扫边找 prefix - k。

中等
前缀和与哈希前缀和哈希表
41H100041LC 49

字母异位词分组 ACM 版

把排序后的字符串作为 key,把同组单词收集到一起。

中等
哈希分组哈希表字符串排序
42H100042LC 128

最长连续序列 ACM 版

用哈希集合判断序列起点,只从最小起点向后延伸。

中等
最长连续序列哈希表数组
43H100043LC 56

合并区间 ACM 版

按左端点排序后维护当前合并区间的右边界。

中等
区间合并区间排序
44H100044LC 189

轮转数组 ACM 版

把 k 对 n 取模后,用切片或三次翻转完成右轮转。

中等
数组轮转数组
45H100045LC 238

除自身以外数组的乘积 ACM 版

先乘左侧前缀,再从右向左累乘右侧后缀。

中等
前后缀积数组前缀和
46H100046LC 136

只出现一次的数字 ACM 版

利用 x ^ x = 0 和 x ^ 0 = x,把所有数异或起来。

简单
位运算位运算数组
47H100047LC 75

颜色分类 ACM 版

用三指针把 0 放左边、2 放右边,1 留在中间。

中等
原地排序数组双指针
48H100048LC 31

下一个排列 ACM 版

从右找第一个下降点,交换后把后缀反转成最小序。

中等
下一个排列数组双指针
49H100049LC 287

寻找重复数 ACM 版

把数组值看作指针走向,用环入口定位重复数字。

中等
快慢指针找重复数组双指针
79H100079LC 146

LRU 缓存 ACM 版

用 Map 维护访问顺序,淘汰最久未使用的键。

中等
哈希与双向链表设计哈希表
93H100093LC 581

最短无序连续子数组 ACM 版

从左维护最大值、从右维护最小值,定位需要排序的左右边界。

中等
数组双向扫描数组双指针

双指针与滑动窗口

围绕左右边界、快慢指针和窗口收缩,训练一次遍历里的不变量。

前置知识双指针滑动窗口字符串
专题进度0/9
02H100002LC 3

无重复字符的最长子串 ACM 版

用左右指针维护一个没有重复字符的窗口。

中等
滑动窗口字符串滑动窗口
03H100003LC 11

盛最多水的容器 ACM 版

每次移动较短的板,练习双指针的不变量。

中等
对撞双指针数组双指针
04H100004LC 15

三数之和 ACM 版

排序后固定第一个数,再用左右指针去重枚举。

中等
排序与双指针排序双指针
14H100014LC 283

移动零 ACM 版

慢指针指向下一个非零元素应该放的位置。

简单
快慢指针数组双指针
29H100029LC 209

长度最小的子数组 ACM 版

窗口和达到 target 后尽量收缩左边界。

中等
滑动窗口数组滑动窗口
50H100050LC 42

接雨水 ACM 版

双指针维护左右最高墙,每次结算较矮一侧能接的水。

困难
接雨水数组双指针单调栈
62H100062LC 5

最长回文子串 ACM 版

枚举每个中心向两边扩展,长度相同取更靠左的答案。

中等
中心扩展字符串双指针
91H100091LC 438

找到字符串中所有字母异位词 ACM 版

维护长度为 p 的窗口计数,计数一致时记录左端点。

中等
定长滑动窗口滑动窗口字符串
97H100097LC 76

最小覆盖子串 ACM 版

右指针扩张满足需求后,左指针尽量收缩窗口。

困难
滑动窗口滑动窗口字符串

矩阵

练二维数组的行列标记、边界收缩、原地旋转和有序矩阵搜索。

前置知识二维数组模拟边界
专题进度0/4
51H100051LC 73

矩阵置零 ACM 版

先记录出现 0 的行和列,再统一把对应位置置零。

中等
矩阵标记矩阵数组哈希表
52H100052LC 54

螺旋矩阵 ACM 版

用上下左右四条边界收缩,按右、下、左、上顺序遍历。

中等
矩阵模拟矩阵模拟
53H100053LC 48

旋转图像 ACM 版

先沿主对角线转置,再反转每一行,得到顺时针旋转 90 度。

中等
矩阵旋转矩阵数组
54H100054LC 240

搜索二维矩阵 II ACM 版

从右上角出发,当前值过大就左移,过小就下移。

中等
矩阵搜索矩阵双指针

回溯

覆盖排列、组合、子集、括号生成和网格搜索,重点练选择、撤销与剪枝。

前置知识递归剪枝路径状态
专题进度0/6
63H100063LC 17

电话号码的字母组合 ACM 版

按数字对应字符集逐层回溯,生成所有组合。

中等
回溯枚举回溯字符串
65H100065LC 22

括号生成 ACM 版

只在左括号数量不超 n、右括号不超左括号时继续搜索。

中等
回溯剪枝回溯字符串
67H100067LC 39

组合总和 ACM 版

排序后从当前下标继续选择,允许重复使用同一个数字。

中等
回溯组合回溯数组
68H100068LC 46

全排列 ACM 版

用 used 数组标记已选择元素,逐层构造排列。

中等
回溯排列回溯数组
69H100069LC 78

子集 ACM 版

每个位置都有选或不选两种选择,按递归顺序收集子集。

中等
回溯子集回溯数组
70H100070LC 79

单词搜索 ACM 版

从每个格子作为起点做 DFS,同一路径中不能重复使用格子。

中等
网格回溯回溯网格

链表

把指针顺序、合并、反转和环形关系看清楚,再用 ACM 输入输出稳定复现。

前置知识链表快慢指针递归
专题进度0/8
06H100006LC 21

合并两个有序链表 ACM 版

用两个指针顺序归并两个升序序列。

简单
链表与双指针链表双指针
13H100013LC 206

反转链表 ACM 版

用 prev、cur、next 三个指针保护链表不断链。

简单
链表指针链表双指针
61H100061LC 2

两数相加 ACM 版

用数组模拟逆序链表,逐位相加并处理进位。

中等
链表模拟链表模拟
64H100064LC 19

删除链表的倒数第 N 个结点 ACM 版

用快慢指针找到倒数第 n 个节点的前驱,再删除目标节点。

中等
链表双指针链表双指针
78H100078LC 141

环形链表 ACM 版

快指针一次走两步、慢指针一次走一步,相遇则有环。

简单
链表快慢指针链表双指针
80H100080LC 148

排序链表 ACM 版

ACM 版用数组模拟链表,重点核对归并排序后的有序结果。

中等
链表排序链表排序
82H100082LC 160

相交链表 ACM 版

两指针分别走完 A+B 与 B+A,相遇点就是交点。

简单
链表双指针链表双指针
84H100084LC 234

回文链表 ACM 版

找到中点后反转后半段,再与前半段逐个比较。

简单
链表反转链表双指针

栈、队列与堆

练括号匹配、单调结构、Top K 和队列窗口,把进出顺序与候选维护想明白。

前置知识单调栈队列
专题进度0/8
05H100005LC 20

有效的括号 ACM 版

遇到左括号入栈,遇到右括号检查栈顶。

简单
字符串
17H100017LC 347

前 K 个高频元素 ACM 版

先计数,再按频率降序和数值升序输出前 K 个。

中等
哈希与堆哈希表
19H100019LC 739

每日温度 ACM 版

栈里保存还没找到更高温度的下标。

中等
单调栈单调栈数组
66H100066LC 23

合并 K 个升序链表 ACM 版

把每个链表当前元素放入小根堆,持续弹出最小值。

困难
堆归并链表
86H100086LC 239

滑动窗口最大值 ACM 版

队列中维护下标,保证对应值递减,队首就是窗口最大值。

困难
单调队列队列滑动窗口
89H100089LC 394

字符串解码 ACM 版

遇到左括号入栈保存当前串和重复次数,右括号时展开。

中等
栈解析字符串
98H100098LC 84

柱状图中最大的矩形 ACM 版

单调递增栈中保存下标,弹栈时用当前下标确定右边界。

困难
单调栈单调栈

二叉树

从层序遍历开始建立树题手感,再逐步进入递归、路径和树形 DP。

前置知识二叉树BFS递归
专题进度0/16
20H100020LC 102

二叉树层序遍历 ACM 版

用队列逐层扩展节点,练习树的层序输出。

中等
二叉树与 BFS二叉树BFS
71H100071LC 94

二叉树中序遍历 ACM 版

递归或栈模拟左根右顺序。

简单
二叉树遍历二叉树DFS
72H100072LC 98

验证二叉搜索树 ACM 版

中序遍历必须严格递增,或递归维护上下界。

中等
BST 中序二叉树BST
73H100073LC 101

对称二叉树 ACM 版

同时比较左子树的左/右与右子树的右/左。

简单
二叉树递归二叉树递归
74H100074LC 104

二叉树的最大深度 ACM 版

最大深度等于左右子树最大深度加一。

简单
二叉树深度二叉树DFS
75H100075LC 105

从前序与中序遍历序列构造二叉树 ACM 版

前序首元素是根,在中序中切分左右子树递归构造。

中等
二叉树构造二叉树递归
76H100076LC 114

二叉树展开为链表 ACM 版

按先序遍历顺序把节点接到右指针链上。

中等
二叉树展开二叉树链表
77H100077LC 124

二叉树中的最大路径和 ACM 版

后序返回单边最大贡献,同时用左右贡献更新全局答案。

困难
树形 DP二叉树动态规划
83H100083LC 226

翻转二叉树 ACM 版

递归交换每个节点的左右子树。

简单
二叉树递归二叉树递归
85H100085LC 236

二叉树的最近公共祖先 ACM 版

后序递归,若左右子树分别找到目标,则当前节点就是 LCA。

中等
二叉树祖先二叉树DFS
88H100088LC 337

打家劫舍 III ACM 版

每个节点返回偷当前节点和不偷当前节点两种收益。

中等
树形 DP二叉树动态规划
90H100090LC 437

路径总和 III ACM 版

DFS 时维护从根到当前节点的前缀和计数。

中等
二叉树前缀和二叉树前缀和
92H100092LC 543

二叉树的直径 ACM 版

每个节点用左右子树深度之和更新最长路径边数。

简单
二叉树深度二叉树DFS
94H100094LC 617

合并二叉树 ACM 版

两个节点都存在时相加,否则保留存在的一侧。

简单
二叉树递归二叉树递归
99H100099LC 199

二叉树的右视图 ACM 版

层序遍历时记录每一层最后一个节点。

中等
二叉树 BFS二叉树BFS
100H100100LC 230

二叉搜索树中第 K 小的元素 ACM 版

BST 的中序遍历是升序,第 k 个访问到的节点就是答案。

中等
BST 中序二叉树BST

图论与搜索

覆盖网格搜索、拓扑排序、并查集、最短路和多源 BFS,重点练建图与访问状态。

前置知识DFSBFS并查集拓扑排序
专题进度0/6
12H100012LC 200

岛屿数量 ACM 版

从未访问过的陆地出发,把同一连通块全部染色。

中等
网格搜索DFSBFS网格
32H100032LC 207

课程表 ACM 版

用入度和队列判断有向图是否存在环。

中等
拓扑排序拓扑排序
33H100033LC 547

省份数量 ACM 版

把相连城市合并,最后统计连通块数量。

中等
并查集并查集
34H100034LC 695

岛屿的最大面积 ACM 版

从每个未访问陆地出发扩展,统计连通块面积。

中等
网格 DFS/BFSDFSBFS网格
35H100035LC 994

腐烂的橘子 ACM 版

把所有腐烂橘子同时入队,按层模拟分钟流逝。

中等
多源 BFSBFS网格
36H100036LC 743

网络延迟时间 ACM 版

从源点跑 Dijkstra,取所有最短距离的最大值。

中等
最短路Dijkstra

二分搜索

把边界、单调性和答案空间拆开练,避免只会套模板。

前置知识二分答案搜索
专题进度0/7
28H100028LC 875

爱吃香蕉的珂珂 ACM 版

二分吃香蕉速度,检查总耗时是否不超过 h。

中等
二分答案二分答案搜索
55H100055LC 35

搜索插入位置 ACM 版

找第一个大于等于 target 的位置,就是插入位置。

简单
二分查找二分
56H100056LC 74

搜索二维矩阵 ACM 版

把矩阵看成一条升序数组,对虚拟下标做二分。

中等
矩阵二分二分矩阵
57H100057LC 34

在排序数组中查找元素的第一个和最后一个位置 ACM 版

分别找第一个大于等于 target 和第一个大于 target 的位置。

中等
边界二分二分数组
58H100058LC 33

搜索旋转排序数组 ACM 版

每次判断哪一半有序,再决定 target 落在哪一侧。

中等
旋转数组二分二分数组
59H100059LC 153

寻找旋转排序数组中的最小值 ACM 版

用右端点判断最小值在左半还是右半。

中等
旋转数组二分二分数组
60H100060LC 4

寻找两个正序数组的中位数 ACM 版

在较短数组上二分切分位置,让左右两侧数量和大小关系都成立。

困难
二分分治二分分治数组

动态规划与贪心

从一维 DP、网格 DP、背包和股票状态机,过渡到能说清状态与转移。

前置知识动态规划背包贪心
专题进度0/22
07H100007LC 53

最大子数组和 ACM 版

维护以当前位置结尾的最大连续和。

中等
动态规划数组动态规划
08H100008LC 70

爬楼梯 ACM 版

把最后一步拆成迈 1 阶或 2 阶,得到斐波那契式转移。

简单
动态规划入门动态规划
09H100009LC 121

买卖股票的最佳时机 ACM 版

一边扫价格,一边记录历史最低买入价。

简单
一次遍历数组贪心
11H100011LC 198

打家劫舍 ACM 版

每个位置只在抢和不抢之间做选择。

中等
一维动态规划动态规划
15H100015LC 300

最长递增子序列 ACM 版

维护每个长度的最小结尾值,练习贪心加二分。

中等
动态规划与二分动态规划二分
16H100016LC 322

零钱兑换 ACM 版

把金额当作状态,枚举最后使用的硬币。

中等
完全背包动态规划背包
21H100021LC 55

跳跃游戏 ACM 版

维护当前能到达的最远位置,判断是否覆盖最后一个下标。

中等
贪心数组贪心
22H100022LC 45

跳跃游戏 II ACM 版

按层扩展当前跳跃范围,每到边界就增加一次跳跃。

中等
贪心数组贪心
23H100023LC 62

不同路径 ACM 版

每个格子的路径数等于上方和左方路径数之和。

中等
二维 DP动态规划网格
24H100024LC 64

最小路径和 ACM 版

原地或滚动数组维护从左上角走到每个格子的最小代价。

中等
二维 DP动态规划网格
25H100025LC 139

单词拆分 ACM 版

dp[i] 表示前 i 个字符能否由词典拼出。

中等
字符串 DP动态规划字符串
26H100026LC 416

分割等和子集 ACM 版

把问题转成是否能凑出 sum / 2。

中等
0-1 背包动态规划背包
27H100027LC 518

零钱兑换 II ACM 版

先枚举硬币,再枚举金额,统计组合数而不是排列数。

中等
完全背包动态规划背包
30H100030LC 152

乘积最大子数组 ACM 版

同时维护以当前位置结尾的最大乘积和最小乘积。

中等
动态规划动态规划数组
31H100031LC 221

最大正方形 ACM 版

dp[i][j] 表示以当前位置为右下角的最大全 1 正方形边长。

中等
二维 DP动态规划矩阵
37H100037LC 213

打家劫舍 II ACM 版

环形房屋拆成不偷首家和不偷末家两种线性情况。

中等
环形 DP动态规划环形数组
38H100038LC 714

买卖股票含手续费 ACM 版

维护持有股票和不持有股票两个状态。

中等
状态机 DP动态规划股票
39H100039LC 309

买卖股票含冷冻期 ACM 版

卖出后第二天不能买入,需要把冷冻状态纳入转移。

中等
状态机 DP动态规划股票
40H100040LC 1143

最长公共子序列 ACM 版

dp[i][j] 表示两个前缀的最长公共子序列长度。

中等
二维 DP动态规划字符串
87H100087LC 279

完全平方数 ACM 版

把平方数当作物品,做最少个数的完全背包 DP。

中等
完全背包动态规划背包
95H100095LC 621

任务调度器 ACM 版

用最高频任务构造空槽,答案取公式值和任务总数的最大值。

中等
贪心计数贪心计数
96H100096LC 763

划分字母区间 ACM 版

每段右边界取段内字符最后出现位置的最大值。

中等
贪心区间贪心字符串