零基础算法求职教练:用 ASCII 动画图解逻辑,用 Pythonic 写法征服面试。
写给所有非科班、零基础的算法学习者:
你是否经历过:
- 看文字题解云里雾里,盯着代码发呆?
- C++ 的指针和 Java 的啰嗦让你望而却步?
- 背了代码过几天就忘,面试时手抖写不出来?
本项目拒绝枯燥的代码堆砌。我用 【独家三步走演示法】,将每一道 LeetCode Hot 100 高频题拆解为“动画+逻辑+代码”,助你彻底掌握算法思维。
每一道题都严格遵循以下三个步骤:
我们不直接给代码,而是先用 ASCII 字符动画模拟算法流程,让你看到指针是怎么移动的,数据是怎么变化的。
示例:001. 两数之和
[ 第 2 轮循环 ] i = 1, num = 7
我们需要: 9 - 7 = 2
回头看小本本: 有 2 吗? -> 有!(下标是 0)
动作: 找到了! -> 返回 [0, 1]
告别 C++ 式的冗长写法。我们充分利用 Python 的切片、列表推导式、zip、enumerate 等特性,写出优雅、高效、面试官爱看的代码。
-
复杂度分析 :用大白话解释
$O(n)$ 与$O(1)$ ,不再死记硬背。 - 避坑指南 :指出新手最容易写错的边界条件(如空数组、索引越界)。
本项目严格遵循 LeetCode Hot 100 的经典分类,涵盖 14 个核心专题。
图例:🟢 简单 | 🟡 中等 | 🔴 困难 | ✅ 已完成
| 状态 | 题号 | 题目 (Title) | 难度 | 核心考点 |
|---|---|---|---|---|
| ✅ | 001 | 两数之和 | 🟢 | 字典查表 |
| ✅ | 049 | 字母异位词分组 | 🟡 | 排序数组作 Key |
| [ ] | 128 | 最长连续序列 | 🟡 | Set 去重与查找 |
| 状态 | 题号 | 题目 (Title) | 难度 | 核心考点 |
|---|---|---|---|---|
| [ ] | 283 | 移动零 | 🟢 | 快慢指针 |
| [ ] | 011 | 盛最多水的容器 | 🟡 | 左右夹逼 |
| [ ] | 015 | 三数之和 | 🟡 | 排序+双指针 |
| 状态 | 题号 | 题目 (Title) | 难度 | 核心考点 |
|---|---|---|---|---|
| [ ] | 003 | 无重复字符的最长子串 | 🟡 | 窗口伸缩+哈希记录 |
| [ ] | 438 | 找到字符串中所有字母异位词 | 🟡 | 窗口固定+计数器 |
| 状态 | 题号 | 题目 (Title) | 难度 | 核心考点 |
|---|---|---|---|---|
| [ ] | 560 | 和为 K 的子数组 | 🟡 | 前缀和+哈希表 |
| [ ] | 239 | 滑动窗口最大值 | 🔴 | 单调队列 |
| [ ] | 076 | 最小覆盖子串 | 🔴 | 滑动窗口+频次统计 |
| 状态 | 题号 | 题目 (Title) | 难度 | 核心考点 |
|---|---|---|---|---|
| [ ] | 053 | 最大子数组和 | 🟡 | 贪心/动态规划 |
| [ ] | 056 | 合并区间 | 🟡 | 排序+合并 |
| [ ] | 189 | 轮转数组 | 🟡 | 三次翻转法 |
| [ ] | 238 | 除自身以外数组的乘积 | 🟡 | 前后缀乘积 |
| [ ] | 041 | 缺失的第一个正数 | 🔴 | 原地哈希 |
| 状态 | 题号 | 题目 (Title) | 难度 | 核心考点 |
|---|---|---|---|---|
| [ ] | 073 | 矩阵置零 | 🟡 | 标记法 |
| [ ] | 054 | 螺旋矩阵 | 🟡 | 模拟边界收缩 |
| [ ] | 048 | 旋转图像 | 🟡 | 矩阵翻转 |
| [ ] | 240 | 搜索二维矩阵 II | 🟡 | Z字形搜索 |
| 状态 | 题号 | 题目 (Title) | 难度 | 核心考点 |
|---|---|---|---|---|
| [ ] | 160 | 相交链表 | 🟢 | 双指针走A+B |
| [ ] | 206 | 反转链表 | 🟢 | 迭代/递归 |
| [ ] | 234 | 回文链表 | 🟢 | 快慢指针+反转 |
| [ ] | 141 | 环形链表 | 🟢 | 快慢指针 |
| [ ] | 142 | 环形链表 II | 🟡 | 数学推导 |
| [ ] | 021 | 合并两个有序链表 | 🟢 | 递归/迭代 |
| [ ] | 002 | 两数相加 | 🟡 | 模拟加法 |
| [ ] | 019 | 删除链表的倒数第 N 个结点 | 🟡 | 双指针间距 |
| [ ] | 024 | 两两交换链表中的节点 | 🟡 | 递归/虚拟头节点 |
| [ ] | 025 | K 个一组翻转链表 | 🔴 | 递归/迭代 |
| [ ] | 138 | 随机链表的复制 | 🟡 | 哈希表/拼接拆分 |
| [ ] | 148 | 排序链表 | 🟡 | 归并排序 |
| [ ] | 146 | LRU 缓存 | 🟡 | 哈希表+双向链表 |
| [ ] | 023 | 合并 K 个升序链表 | 🔴 | 优先队列/分治 |
| 状态 | 题号 | 题目 (Title) | 难度 | 核心考点 |
|---|---|---|---|---|
| [ ] | 094 | 二叉树的中序遍历 | 🟢 | 递归/栈 |
| [ ] | 104 | 二叉树的最大深度 | 🟢 | DFS/BFS |
| [ ] | 226 | 翻转二叉树 | 🟢 | 递归 |
| [ ] | 101 | 对称二叉树 | 🟢 | 递归比较 |
| [ ] | 543 | 二叉树的直径 | 🟢 | DFS+全局变量 |
| [ ] | 102 | 二叉树的层序遍历 | 🟡 | BFS队列 |
| [ ] | 108 | 将有序数组转换为二叉搜索树 | 🟢 | 递归分治 |
| [ ] | 098 | 验证二叉搜索树 | 🟡 | 中序遍历有序 |
| [ ] | 230 | 二叉搜索树中第 K 小的元素 | 🟡 | 中序遍历 |
| [ ] | 199 | 二叉树的右视图 | 🟡 | BFS/DFS |
| [ ] | 114 | 二叉树展开为链表 | 🟡 | 后序遍历 |
| [ ] | 105 | 从前序与中序遍历序列构造二叉树 | 🟡 | 递归分治 |
| [ ] | 437 | 路径总和 III | 🟡 | 前缀和+DFS |
| [ ] | 236 | 二叉树的最近公共祖先 | 🟡 | 递归返回值判断 |
| [ ] | 124 | 二叉树中的最大路径和 | 🔴 | 递归+贪心 |
| 状态 | 题号 | 题目 (Title) | 难度 | 核心考点 |
|---|---|---|---|---|
| [ ] | 200 | 岛屿数量 | 🟡 | DFS/BFS |
| [ ] | 994 | 腐烂的橘子 | 🟡 | BFS层序 |
| [ ] | 207 | 课程表 | 🟡 | 拓扑排序 |
| [ ] | 208 | 实现 Trie (前缀树) | 🟡 | 字典树结构 |
| 状态 | 题号 | 题目 (Title) | 难度 | 核心考点 |
|---|---|---|---|---|
| [ ] | 046 | 全排列 | 🟡 | 回溯模板 |
| [ ] | 078 | 子集 | 🟡 | 回溯/位运算 |
| [ ] | 017 | 电话号码的字母组合 | 🟡 | 映射+回溯 |
| [ ] | 039 | 组合总和 | 🟡 | 剪枝+回溯 |
| [ ] | 022 | 括号生成 | 🟡 | 合法性判断 |
| [ ] | 079 | 单词搜索 | 🟡 | DFS+回溯 |
| [ ] | 131 | 分割回文串 | 🟡 | 动态规划+回溯 |
| [ ] | 051 | N 皇后 | 🔴 | 经典回溯 |
| 状态 | 题号 | 题目 (Title) | 难度 | 核心考点 |
|---|---|---|---|---|
| [ ] | 035 | 搜索插入位置 | 🟢 | 基础二分 |
| [ ] | 074 | 搜索二维矩阵 | 🟡 | 坐标转换 |
| [ ] | 034 | 在排序数组中查找元素的第一个和最后一个位置 | 🟡 | 两次二分 |
| [ ] | 033 | 搜索旋转排序数组 | 🟡 | 局部有序判断 |
| [ ] | 153 | 寻找旋转排序数组中的最小值 | 🟡 | 二分变体 |
| [ ] | 004 | 寻找两个正序数组的中位数 | 🔴 | 划分数组 |
| 状态 | 题号 | 题目 (Title) | 难度 | 核心考点 |
|---|---|---|---|---|
| [ ] | 020 | 有效的括号 | 🟢 | 栈匹配 |
| [ ] | 155 | 最小栈 | 🟡 | 辅助栈 |
| [ ] | 394 | 字符串解码 | 🟡 | 双栈法 |
| [ ] | 739 | 每日温度 | 🟡 | 单调栈 |
| [ ] | 084 | 柱状图中最大的矩形 | 🔴 | 单调栈 |
| 状态 | 题号 | 题目 (Title) | 难度 | 核心考点 |
|---|---|---|---|---|
| [ ] | 215 | 数组中的第K个最大元素 | 🟡 | 堆排序/快速选择 |
| [ ] | 347 | 前 K 个高频元素 | 🟡 | 堆/桶排序 |
| [ ] | 295 | 数据流的中位数 | 🔴 | 双堆 |
| 状态 | 题号 | 题目 (Title) | 难度 | 核心考点 |
|---|---|---|---|---|
| [ ] | 121 | 买卖股票的最佳时机 | 🟢 | 维护最小值 |
| [ ] | 055 | 跳跃游戏 | 🟡 | 覆盖范围 |
| [ ] | 045 | 跳跃游戏 II | 🟡 | 最远边界 |
| [ ] | 763 | 划分字母区间 | 🟡 | 记录最后出现位置 |
| 状态 | 题号 | 题目 (Title) | 难度 | 核心考点 |
|---|---|---|---|---|
| [ ] | 070 | 爬楼梯 | 🟢 | 斐波那契 |
| [ ] | 118 | 杨辉三角 | 🟢 | 模拟 |
| [ ] | 198 | 打家劫舍 | 🟡 | 状态转移 |
| [ ] | 279 | 完全平方数 | 🟡 | 类似零钱兑换 |
| [ ] | 322 | 零钱兑换 | 🟡 | 完全背包 |
| [ ] | 139 | 单词拆分 | 🟡 | 字符串DP |
| [ ] | 300 | 最长递增子序列 | 🟡 | O(nlogn)贪心 |
| [ ] | 152 | 乘积最大子数组 | 🟡 | 维护最大最小 |
| [ ] | 416 | 分割等和子集 | 🟡 | 01背包 |
| [ ] | 032 | 最长有效括号 | 🔴 | 栈/DP |
| 状态 | 题号 | 题目 (Title) | 难度 | 核心考点 |
|---|---|---|---|---|
| [ ] | 062 | 不同路径 | 🟡 | 基础二维DP |
| [ ] | 064 | 最小路径和 | 🟡 | 二维DP |
| [ ] | 005 | 最长回文子串 | 🟡 | 中心扩散/DP |
| [ ] | 1143 | 最长公共子序列 | 🟡 | 经典LCS |
| [ ] | 072 | 编辑距离 | 🟡 | 二维DP |
| 状态 | 题号 | 题目 (Title) | 难度 | 核心考点 |
|---|---|---|---|---|
| [ ] | 136 | 只出现一次的数字 | 🟢 | 异或运算 |
| [ ] | 169 | 多数元素 | 🟢 | 摩尔投票 |
| [ ] | 075 | 颜色分类 | 🟡 | 双指针/三路快排 |
| [ ] | 031 | 下一个排列 | 🟡 | 数学规律 |
| [ ] | 287 | 寻找重复数 | 🟡 | 二分/快慢指针 |
.
├── 001-Two-Sum/
│ ├── solution.py # 可直接运行的 Python 代码
│ ├── README.md # 详细图解与面试分析
│ └── animation.gif # (可选) 动态演示图
├── 015-3Sum/
│ ├── solution.py
│ └── README.md
├── images/ # 存放公共图片资源
└── README.md # 项目主页
如果你发现了解法中的错误,或者有更优雅的 Python 写法,欢迎提 Issue 或 PR!让我们一起把这个仓库打造成 Python 算法面试的标杆 。