1. 为什么选择每日两道力扣题
去年团队来了个ACM金牌选手,我观察到他每天雷打不动做两道算法题。问他为什么坚持,他说:"就像运动员每天要做基础训练一样,解题保持手感。"这个习惯我坚持了半年后,明显感觉在代码面试和实际工作中,对数据结构的敏感度和算法思维都提升了不止一个档次。
每日两道是个很科学的量——既能保证持续练习,又不会占用太多时间。我通常安排在午休后或晚上睡前,每道题控制在25分钟内。这个节奏既能保持思维活跃,又不会影响正常工作生活。
2. Day6精选题目解析
2.1 第一题:二叉树层序遍历(LeetCode 102)
这道经典题目考察的是广度优先搜索(BFS)的基础应用。很多看似复杂的树形问题,比如找最大宽度、锯齿形遍历,都是这个基础题的变种。
python复制from collections import deque
def levelOrder(root):
if not root: return []
queue = deque([root])
res = []
while queue:
level_size = len(queue)
current_level = []
for _ in range(level_size):
node = queue.popleft()
current_level.append(node.val)
if node.left: queue.append(node.left)
if node.right: queue.append(node.right)
res.append(current_level)
return res
关键点在于:
- 使用队列而不是递归(DFS会改变节点访问顺序)
- 每次处理一层的所有节点(通过level_size控制)
- 时间复杂度O(n),空间复杂度O(n)
实际面试中,面试官可能会追问:如何优化空间复杂度?这时可以讨论Morris遍历的变种,但通常BFS方案已经足够。
2.2 第二题:接雨水(LeetCode 42)
这道hard题看似复杂,其实掌握了双指针技巧后就能优雅解决。我最初用暴力法O(n²)超时,后来发现以下O(n)解法:
python复制def trap(height):
left, right = 0, len(height)-1
left_max = right_max = 0
res = 0
while left < right:
if height[left] < height[right]:
if height[left] >= left_max:
left_max = height[left]
else:
res += left_max - height[left]
left += 1
else:
if height[right] >= right_max:
right_max = height[right]
else:
res += right_max - height[right]
right -= 1
return res
核心思路:
- 左右指针向中间移动
- 维护左右两侧的最大高度
- 较小的一侧决定当前能接的雨水量
- 时间复杂度O(n),空间复杂度O(1)
3. 解题技巧与避坑指南
3.1 调试技巧实录
在解接雨水问题时,我犯过这些错误:
- 没考虑空数组情况 → 添加边界检查
- 双指针移动条件写反 → 画图理清逻辑
- 漏更新max高度 → 添加else分支
建议调试时:
- 在白板上画出测试用例的示意图
- 打印指针位置和当前计算结果
- 使用小规模测试用例(如[2,0,2])
3.2 时间管理策略
我的25分钟计时法:
- 前5分钟:仔细读题+举例验证理解
- 接下来15分钟:编写代码+基础测试
- 最后5分钟:优化+边界检查
如果超时:
- 先写暴力解法思路
- 记录卡点位置
- 查看讨论区前先自己思考10分钟
4. 刷题工具链推荐
4.1 本地开发环境
我用的VS Code配置:
- LeetCode插件(直接提交测试)
- Python环境+PyLint
- 自定义代码片段(快速生成测试用例)
json复制// snippets.json
"LeetCode Test": {
"prefix": "lctest",
"body": [
"if __name__ == '__main__':",
" test_cases = [",
" ([2,0,2], 2),",
" ([0,1,0,2,1,0,1,3,2,1,2,1], 6)",
" ]",
" for input, expected in test_cases:",
" output = Solution().trap(input)",
" print(f\"Input: {input}\")",
" print(f\"Output: {output}\")",
" print(f\"Expected: {expected}\")",
" print(\"==\" if output == expected else \"!!\")"
]
}
4.2 移动端利器
手机上的刷题组合:
- 官方App(随时查看题目)
- Pythonista(iOS上写代码)
- 石墨文档(记录解题思路)
5. 个人进阶路线建议
从我的经验看,刷题可以分为三个阶段:
-
新手期(前100题):
- 按类型刷(数组→链表→树)
- 重点掌握基础数据结构操作
- 每道题写详细注释
-
提升期(100-300题):
- 练习同类型不同变种
- 尝试多种解法
- 参加周赛锻炼速度
-
精通期(300+题):
- 专注hard题
- 研究最优解数学证明
- 尝试原创题目设计
最近发现一个有效方法:把做过的题目讲给同事听。教是最好的学,在讲解过程中常会发现自己理解不深的地方。
