1. 项目背景与价值
国庆长假对于程序员来说是个难得的充电期。去年国庆我给自己定了个小目标:用7天时间系统梳理基础算法知识,并通过LeetCode平台进行针对性训练。这个"国庆做题记录"系列就是当时每天的学习总结,主要涵盖排序、查找、动态规划等基础算法类型。
为什么要做这件事?在面试辅导过程中,我发现很多候选人(包括当年的自己)容易陷入两个误区:要么沉迷刷题数量忽视质量,要么死记硬背模板代码。这个项目的核心价值在于:
- 建立算法思维而非背诵解法
- 通过刻意练习培养代码肌肉记忆
- 形成可复用的解题方法论
2. 训练体系设计
2.1 题目筛选标准
我按照"3-3-3"原则选择题目:
- 3道经典题(如快排、二分查找)
- 3道变种题(如带条件的二分查找)
- 3道综合题(如结合DFS的动态规划)
# 示例:二分查找变种题 def search(nums, target): left, right = 0, len(nums)-1 while left <= right: mid = left + (right-left)//2 if nums[mid] == target: return mid # 处理旋转数组的特殊情况 if nums[left] <= nums[mid]: if nums[left] <= target < nums[mid]: right = mid - 1 else: left = mid + 1 else: if nums[mid] < target <= nums[right]: left = mid + 1 else: right = mid - 1 return -12.2 每日训练流程
早间理论(1小时):
- 精读《算法导论》相关章节
- 手推算法执行过程(建议使用draw.io画流程图)
午后实战(3小时):
- 按难度顺序解题
- 必须手写测试用例
- 记录每种解法的时空复杂度
晚间复盘(1小时):
- 对比最优解
- 整理错题本
- 写解题模板注释
3. 核心算法精要
3.1 动态规划四步法
以经典的"零钱兑换"问题为例:
- 定义状态:dp[i]表示金额i的最小硬币数
- 初始化:dp[0]=0,其他设为inf
- 状态转移:
for coin in coins: for i in range(coin, amount+1): dp[i] = min(dp[i], dp[i-coin]+1) - 返回结果:dp[amount]
关键技巧:打印DP表调试时,建议用pandas.DataFrame更直观
3.2 回溯算法模板
def backtrack(path, choices): if meet_condition: results.append(path) return for choice in choices: if not is_valid(choice): continue path.append(choice) backtrack(path, new_choices) path.pop()常见优化手段:
- 排序剪枝(如组合总和问题)
- 记忆化搜索(如单词拆分)
- 位图压缩状态(如N皇后)
4. 实战问题排查
4.1 边界条件大全
| 问题类型 | 易错点 | 测试用例示例 |
|---|---|---|
| 二分查找 | 溢出计算 | [2147483647], 2147483647 |
| 链表操作 | 头尾节点处理 | 单节点链表 |
| 树遍历 | 空子树处理 | 所有节点只有左子树 |
| 滑动窗口 | 窗口大小变化 | s="a", t="aa" |
4.2 性能优化案例
问题:三数之和暴力解法O(n³)超时
优化步骤:
- 先排序(O(nlogn))
- 固定第一个数后转化为双指针问题
- 跳过重复元素
def threeSum(nums): nums.sort() res = [] for i in range(len(nums)-2): if i > 0 and nums[i] == nums[i-1]: continue l, r = i+1, len(nums)-1 while l < r: s = nums[i] + nums[l] + nums[r] if s < 0: l += 1 elif s > 0: r -= 1 else: res.append([nums[i], nums[l], nums[r]]) while l < r and nums[l] == nums[l+1]: l += 1 while l < r and nums[r] == nums[r-1]: r -= 1 l += 1 r -= 1 return res5. 工具链配置建议
5.1 本地调试环境
- VS Code配置:
"code-runner.executorMap": { "python": "python3 -u $fileName && leetcode test $fileName -t '$testCase'" } - Jupyter Notebook模板:
from typing import List import unittest class TestSolution(unittest.TestCase): def test_case1(self): self.assertEqual(Solution().func(), expected_result) if __name__ == "__main__": unittest.main(argv=['first-arg-is-ignored'], exit=False)
5.2 效率工具推荐
可视化工具:
- VisuAlgo(算法动画演示)
- Python Tutor(代码执行可视化)
插件推荐:
- LeetCode Editor(VS Code插件)
- Codeforces Helper(浏览器插件)
6. 可持续训练方案
国庆集训结束后,我保持每周至少5小时的算法训练:
- 周一:专题突破(主攻薄弱题型)
- 周三:周赛复盘(分析错题)
- 周末:模拟面试(使用Pramp平台)
推荐训练量:
- 初级:每周3题(含1道困难题)
- 进阶:每周5题(含2道困难题)
最后分享我的错题本管理技巧:用Notion建立算法题库数据库,按tag分类并记录解题思路、时间复杂度和易错点。每次面试前只需重点复习标星题目,效率提升非常明显。