LEARNING IN PUBLIC · 2026
把每一道题,
整理成可复用的思路。
这里记录我的 LeetCode 学习过程:不只写答案,也留下推导、踩坑和可以迁移到下一道题的模式。
# 一次遍历 · O(n)
def two_sum(nums, target):
seen = {}
for i, x in enumerate(nums):
need = target - x
if need in seen:
return [seen[need], i]
seen[x] = iHASH MAP01ACCEPTED ✓
LATEST NOTES
最近整理
共 25 篇 · 持续更新中
反转链表
Easy反转的本质是逐个改写 next 指针,难点在于改指针之前别把后继节点弄丢。
两数之和
Easy用一次遍历和一张哈希表,把“寻找另一个数”从线性搜索降到常数时间。
二分查找
Easy二分的难点不在取中点,而在于始终说清楚搜索区间的定义。
对称二叉树
Easy对称不是一棵树的性质,而是两棵子树互为镜像的性质,问题从一元变成了二元。
无重复字符的最长子串
Medium用滑动窗口维护一个始终合法的区间,并在右边界移动时更新答案。
环形链表
Easy快慢指针每轮把间距缩短一格,只要有环就一定追上,这是它必然相遇的原因。
有效的括号
Easy括号匹配的本质是“最近打开的必须最先关闭”,这正好是栈的定义。
相交链表
Easy两个指针各自走完自己再走对方,走过的总长相同,会在交点或同时到达终点相遇。
爬楼梯
Easy到第 n 阶的走法数 = 到 n-1 阶 + 到 n-2 阶,它其实就是斐波那契。
合并两个有序链表
Easy用一个哨兵节点省掉“第一个节点特殊处理”的分支,合并就退化成不断挑更小的那个。
回文链表
Easy把找中点、反转后半、再对比拼在一起,就能在 O(1) 空间里判断链表是否回文。
二叉树的中序遍历
Easy递归天然记住了「回来以后接着往下走」,显式栈就得自己把这件事补上。
二叉树的最大深度
Easy把整棵树的深度拆成子树的深度加一,递归就成了对定义的直接翻译。
买卖股票的最佳时机
Easy只买卖一次,答案就是“每天卖出”时能拿到的最大利润,而它只依赖历史最低价。
只出现一次的数字
Easy异或让成对的数字自我湮灭,无需额外空间就能把落单的那个筛出来。
最小栈
Easy让每个元素在入栈时就记住“它之下的最小值”,getMin 就退化成读栈顶。
翻转二叉树
Easy翻转整棵树等于交换根的左右孩子,再让两棵子树各自翻转——一个动作递归下去就够了。
移动零
Easy把“搬运零”反过来想成“收拢非零元素”,一个慢指针就能标记它们该落的位置。
二叉树的直径
Easy直径的答案藏在每个节点的「左深 + 右深」里,顺着求深度的递归就能顺手捞出来。
多数元素
Easy摩尔投票把“统计谁最多”变成“互相抵消”,多数元素靠数量优势一定活到最后。
合并二叉树
Easy让两棵树的指针同步下探,空节点就地把位置让给另一棵,合并只需处理「同时存在」这一种情况。
最短无序连续子数组
Easy无序段的边界由“越界”的元素决定,一左一右两趟扫描就能同时定位两端。
把二叉搜索树转换为累加树
Easy反着中序遍历,节点就按从大到小的顺序出现,一个累加变量便能一路加下去。
汉明距离
Easy先用异或把“不同的位”变成 1,问题就归结成“数一个数里有几个 1”。
找到所有数组中消失的数字
Easy数值范围恰好等于下标范围,把数组本身当哈希桶,用正负号记录谁来过。
KNOWLEDGE MAP
不是刷题清单,
是我的模式库。
把零散题目归回核心数据结构和算法模式,下一次遇见相似问题时,能更快识别它。
数组与哈希
6 篇笔记
双指针
7 篇笔记
滑动窗口
1 篇笔记
二分查找
1 篇笔记
ABOUT THIS LOG
“理解一道题的标志,不是记住代码,
而是能说清楚为什么这样做。”