卡住好几个小时?LeetCode 的“Productive Struggle”法则
Source: Dev.to
最初发布于 LeetCopilot Blog
盯着屏幕看了 2 小时并不是坚持——那是浪费时间。下面给出一个基于技能的时间上限,帮助你决定何时查看答案。
你已经盯着这道题目看了 90 分钟。你有一些想法,但都没有奏效。你不确定自己是“快要成功了”还是完全跑偏了。
内部辩论
- 选项 1: “继续尝试。总会想通的。放弃是软弱。”
- 选项 2: “这在浪费时间。看看答案然后继续前进。”
你在坚持与效率之间陷入僵局。
网上的建议往往毫无帮助:
- “永不放弃!” → 导致 4 小时的苦苦挣扎
- “15 分钟后就看答案” → 学不到东西
- “视情况而定” → 毫无帮助
真相: 确实有一个合适的时间长度,只是它会随你的水平、题目难度和目标而变化。本指南提供一个基于技能的框架,帮助你判断何时坚持、何时放手,消除猜测。
TL;DR
- 核心问题: 没有通用的时间上限;“高效挣扎”(以学习为中心)需要 30‑90 分钟,具体取决于技能水平,而“低效挣扎”(没有理解的随意尝试)无论时长都在浪费时间。
- 为何重要: 过快查看答案会阻碍技能提升;过度挣扎(例如 4 小时马拉松)会导致倦怠,并且对大多数学习者来说,90 分钟后收益递减。
- 框架: 基于技能的时间预算(初学者:45‑60 分钟,中级:30‑45 分钟,高级:60‑90 分钟),并在 15/30/45 分钟节点设置进度检查点,以判断你是取得实质性进展还是原地打转。
- 常见初学者错误: 使用固定时间限制(例如“一律 30 分钟”),忽视了 Easy 与 Hard 题目以及学习 vs. 面试准备情境需要不同的挣扎时长。
- 你将学到的内容: 用于区分高效与低效挣扎的诊断问题、情境化的时间上限(学习新模式 vs. 练习已知模式),以及如何通过分级提示系统 用微提示延长高效挣扎而不是直接给出完整答案。
理解高效挣扎 vs. 低效挣扎
高效挣扎
表现形式
- 产生想法并进行测试
- 每一次尝试都能提供新信息
- 理解为什么某些方法会失败
- 有进展,即使还没有完全解出题目
示例
| 时间 | 操作 |
|---|---|
| 15 分钟 | 尝试暴力解法,发现 O(n²) 太慢 |
| 30 分钟 | 尝试哈希表,发现边界情况问题 |
| 45 分钟 | 优化思路,接近答案 |
这种挣扎在提升技能。
低效挣扎
表现形式
- 重复同一个失败的思路,期待奇迹出现
- 尝试之间没有新洞见
- 完全的思维阻塞(毫无想法)
- 充满挫败感却没有学习收获
示例
- 15 分钟:卡住
- 30 分钟:仍卡在同一个点
- 60 分钟:愤怒且毫无进展
这种挣扎在浪费时间并滋生怨恨。
基于技能的时间预算框架
完全初学者(< 20 道题目已解)
- 时间预算: 最多 45‑60 分钟
- 原因: 你还在学习基础概念,而不是追求最优;没有指导的长时间挣扎会养成坏习惯,需要频繁验证。
检查点
| 时间 | 问题 |
|---|---|
| 15 分钟 | 我是否理解了题目在问什么? |
| 30 分钟 | 我是否已经写出任何实现(即使是暴力的)? |
| 45 分钟 | 我是在取得进展还是在原地打转? |
45 分钟的决策
- 有进展 → 再继续到 60 分钟
- 没有进展 → 查看提示(而不是完整答案)
- 提示后仍卡住 → 查看答案,深入理解后再从记忆中重写代码
中级编码者(已解 20‑100 道题目)
- 时间预算: 中等题目 30‑45 分钟,困难题目 60‑90 分钟
- 原因: 你能更快识别模式并快速实现已知方法;对难点概念的延长挣扎是有价值的。
检查点
| 时间 | 问题 |
|---|---|
| 15 分钟 | 我是否已经识别出模式/思路? |
| 30 分钟 | 我是否已经写出可运行的解法? |
| 45 分钟(中等) | 我是在优化还是卡住了? |
45 分钟的决策
- 中等题已解 → 直接进入下一题
- 中等题未解 → 查看一个思路提示,重新尝试约 15 分钟,然后若仍卡住再看完整答案
- 困难题未解 → 属于可接受范围,90 分钟后再查看答案
高级(已解 100+ 题,基础扎实)
- 时间预算: 学习时 60‑90 分钟,刷题时 15‑30 分钟
- 原因: 能进行更深入的思考;对解法的探索能带来更大收益;对模式的巩固则使用更短时间。
检查点
| 时间 | 问题 |
|---|---|
| 30 分钟 | 是否考虑了多种解法? |
| 60 分钟 | 是否找到了最优解或接近最优? |
| 90 分钟 | 是否出现收益递减的现象? |
90 分钟的决策
- 即使接近,也建议查看答案——你的首个思路往往已经足够好。
- 在找到可运行解法后再研究最优解,比一直磨砺完美更有助于学习。
情境化时间上限
情境 1:学习新模式(如滑动窗口、动态规划)
- 时间预算: 60‑90 分钟
- 策略
- 前 30 分钟:自行尝试
- 查看思路解释(不是代码)
- 再用 30 分钟实现
- 若仍卡住 → 查看完整答案并深入学习
情境 2:练习已知模式
- 时间预算: 30‑45 分钟
- 策略
- 前 15 分钟:识别模式
- 前 30 分钟:实现代码
- 若卡住 → 提示实现细节,而非完整答案
情境 3:面试模拟
- 时间预算: 中等 15‑25 分钟,困难 30‑40 分钟
- 策略
- 严格计时;即使未解也要在时间到时结束
- 事后复盘答案,记录“面试失败”以校准期望
情境 4:复习 / 间隔重复
- 时间预算: 10‑20 分钟
- 策略
- 若 20 分钟内未解,说明之前的学习不够扎实
- 查看答案,重新编码,并安排下一次复习
检查点决策树
15 分钟时
提问: “我是否已经弄清楚题目要解决什么?”
- ✅ 是 → 继续
- ❌ 否 → 重读题目,查看示例,明确约束条件
- ❌❌ 仍不清楚 → 查看题目解释(不是答案)
30 分钟时
提问: “我是否已经写出任何可运行的代码?”
- ✅ 是,暴力解法可跑 → 优化或直接进入下一题
- ⚠️ 是,但测试不通过 → 再调试约 15 分钟
- ❌ 没有代码 → 查看思路提示
45 分钟时(初学者 / 中级)
提问: “相较于 30 分钟,我是否更接近解答?”
- ✅ 是,取得进展 → 再继续到 60 分钟
- ❌ 否,仍原地 → 查看完整答案
- ⚠️ 感到沮丧/愤怒 → 休息 10 分钟后再决定
60‑90 分钟时(高级)
提问: “再花 30 分钟能否解决?”
- ✅ 可能,只差一个 bug → 再坚持到 90 分钟
- ❌ 没有明确思路 → 查看答案
- ⚠️ 收益递减 → 即使接近,也建议现在学习最优解,而不是继续硬磨
红旗:何时立即停止
红旗 1:重复相同的失败尝试
如果同一思路已经尝试了 3 次以上且没有新收获,说明陷入循环。
行动: 查看提示或休息一下。
红旗 2:情绪压力
如果感到愤怒、绝望或眼眶发红,学习已经中断。
行动: 立刻离开,明天再以全新状态回来。