
1. LeetCode刷题笔记的价值与定位第一次接触LeetCode是在2015年当时为了准备硅谷公司的技术面试我花了三个月时间刷完了前150题。七年过去我依然保持着每周至少做2-3道题的习惯累计解题量超过800道。这份笔记记录了我从算法小白到Facebook面试官的完整成长路径。LeetCode本质上是一个算法题库但它更重要的价值在于培养工程师的计算思维。每道题目都是现实工程问题的抽象比如LRU缓存机制对应着系统设计中的缓存淘汰策略股票买卖问题则反映了动态规划在量化交易中的应用。我的笔记特别注重这种题目-原理-应用的三层映射关系。重要认知刷题不是背题笔记的核心价值在于建立解题思路的可复用模式。我习惯用红色标注思路卡点蓝色记录优化路径绿色标记关联场景。2. 高效刷题方法论2.1 题目分类与知识图谱构建我将LeetCode题目划分为7个核心维度时间复杂度维度O(n)到O(n!)解题范式维度DFS/BFS/DP等数据结构维度树/图/堆等企业高频维度各公司常考题场景映射维度对应哪些实际工程问题代码模板维度可复用的代码骨架陷阱警示维度边界条件与易错点例如第215题数组中的第K个最大元素在我的笔记中会同时出现在堆结构、快速选择算法、TopK问题场景三个分类下。这种多维索引方式使得后期复习效率提升3倍以上。2.2 五步刷题法实战以第146题LRU缓存为例展示我的标准流程裸写阶段30分钟不查阅任何资料直接解题记录初始思路和遇到的障碍本例中我最初尝试用数组哈希表实现发现删除操作无法满足O(1)分析阶段20分钟研究题目相关数据结构特性发现需要双向链表维护访问顺序哈希表存储节点引用实现快速访问优化阶段40分钟对比Java的LinkedHashMap实现手动实现双向链表更节省内存封装节点操作减少代码重复模板化阶段15分钟class LRUCache: def __init__(self, capacity: int): self.cap capacity self.cache {} self.head Node(0, 0) self.tail Node(0, 0) self.head.next self.tail self.tail.prev self.head def _remove(self, node): prev, nxt node.prev, node.next prev.next, nxt.prev nxt, prev def _add(self, node): p self.tail.prev p.next node self.tail.prev node node.prev p node.next self.tail应用联想阶段15分钟数据库查询缓存CDN边缘节点缓存策略浏览器缓存淘汰机制3. 核心算法模板精讲3.1 动态规划四要素模板以第322题零钱兑换为例状态定义dp[i]表示组成金额i所需的最少硬币数转移方程dp[i] min(dp[i], dp[i - coin] 1) for coin in coins初始化条件dp[0] 0其他位置初始化为amount 1遍历顺序外层遍历金额内层遍历硬币完全背包问题需先遍历物品再遍历容量易错点不要混淆完全背包和01背包的遍历顺序前者正序后者倒序。3.2 二叉树递归模板解决第94/144/145题的前中后序遍历def traverse(root): if not root: return # 前序位置 traverse(root.left) # 中序位置 traverse(root.right) # 后序位置这个基础模板可以延伸出深度计算后序路径求和前序BST验证中序4. 企业真题破解策略4.1 谷歌高频题型分析谷歌偏爱考察图论和设计题典型如第489题扫地机器人DFS回溯第588设计内存文件系统Trie元数据管理解题要点明确API设计规范处理并发访问边界条件权衡时间与空间复杂度4.2 亚马逊常考模式亚马逊常考字符串处理和系统设计第767重构字符串最大堆第460LFU缓存双哈希表频次链表特色要求代码可读性高于性能优化需要详细注释设计思路5. 刷题环境配置建议5.1 本地IDE配置我的VSCode刷题配置{ editor.codeActionsOnSave: { source.organizeImports: true }, python.formatting.provider: black, python.linting.pylintEnabled: true }必备插件LeetCode官方插件Code Runner快速测试GitLens版本对比5.2 调试技巧二叉树可视化调试代码def print_tree(root, level0, prefixRoot: ): if not root: return print( * (level * 4) prefix str(root.val)) print_tree(root.left, level 1, L--- ) print_tree(root.right, level 1, R--- )6. 进阶提升路径6.1 周赛策略我的周赛时间分配方案前10分钟通读所有题目第1题目标5分钟内完成第2题最多15分钟第3题预留25分钟第4题至少20分钟关键技巧先写暴力解保分使用Python内置库提升速度预处理输入数据减少重复计算6.2 系统设计衔接如何从算法题过渡到系统设计识别题目中的设计元素如LRU缓存扩展考虑分布式场景引入CAP理论分析估算QPS和存储需求例如第380题常数时间插入删除可以延伸讨论数据库索引实现分布式一致性哈希写入放大问题优化7. 常见问题诊断7.1 递归栈溢出典型场景第124题二叉树最大路径和解决方案检查基线条件是否完备添加深度参数限制递归层数改用迭代法实现DFSdef maxPathSum(root): stack [(root, False)] max_sum float(-inf) while stack: node, visited stack.pop() if not node: continue if visited: # 后序处理逻辑 else: stack.append((node, True)) stack.append((node.right, False)) stack.append((node.left, False))7.2 边界条件遗漏高频错误案例第8题字符串转整数忘记处理/-符号第56题合并区间输入为空列表的情况第200题岛屿数量网格为None的判断防御性编程检查清单输入为空/None单元素集合极值测试最大/最小输入类型检查意外输入类型8. 笔记管理系统8.1 Obsidian知识图谱我的笔记目录结构LeetCode/ ├── ByNumber/ │ ├── 001-100/ │ ├── 101-200/ ├── ByCompany/ │ ├── Google/ │ ├── Amazon/ ├── ByAlgorithm/ │ ├── DP/ │ ├── Backtracking/ └── Templates/ ├── BinarySearch.md ├── SlidingWindow.md使用Dataview插件实现自动索引dataview TABLE difficulty, tags FROM LeetCode/ByNumber WHERE contains(tags, DFS) SORT number ASC8.2 Anki记忆卡片设计的问答卡片示例Front: 快速排序最差时间复杂度何时出现Back: O(n²)当数组已经有序且总选第一个元素为pivot时记忆曲线设置新卡片20张/天复习间隔1 2 4 7 15天失败卡片重置为1天间隔这套笔记系统帮助我在最近一次面试中仅用10分钟就完成了原本需要30分钟的DP问题。当面试官看到我流畅地写出带有错误处理的完整代码时直接跳过了后续的编码考察环节。