关于 DSA 与数学的思考——多年教学的体会
Source: Dev.to
Introduction
我最近一直在思考一件事——我还没有完全弄清楚,所以这更像是自言自语,而不是在给出建议。
每当面试临近,我就会翻到 Striver 的表格,从头再来一遍。我会重新做已经做过的题目。做题时我会想“嗯,这我知道”…但过了几周,这些记忆就消失了。不是代码——有时连思路都忘了。于是我又回到原点。
我觉得问题(至少对我来说)在于我学习 DSA 的方式。它非常依赖模式:
- 这是滑动窗口
- 这是前缀和
- 这是双指针
整个过程变成了:
“我能从题目中识别出这个模式吗?”
但只要题目稍微有点变形,我的大脑就会直接说:“不行 👍”。
我们小时候学数学时并不是这样。数学并不抽象,它是苹果、钱、身边的计数。你可以看到它。现在却全是符号、技巧、模式,而在某个阶段我们不再在现实生活中看到它,尽管它可能仍然存在。
A Different Perspective
如果我们不做
“question → pattern”
而尝试
“pattern → where does this exist in real life?”
换句话说,与其在题目中识别模式,不如把它们和现实情境联系起来。
Example 1: Subarray Sum = K
Typical mental shortcut: “prefix sum + hashmap 👍 done”。两周后:“hashmap 是什么?? 😭”。
Real‑world analogy: 你在监控 CPU 使用率,每秒记录一次使用情况。有时会突升到 90%,系统会触发重启。调试时你想找出是哪段连续时间窗口导致了这次突升。
你实际上在做:
- 累计使用率
- 按时间扫描
- 找到总和等于 90 的连续区间
一旦找到 → 那就是罪魁祸首 → 那就是触发重启的原因。
这正是 subarray‑sum‑equals‑k 问题,只是感觉不像是“套用一个模式”,而是“我自然会这么做”。
Example 2: Minimum Window Substring
Typical mental shortcut: “sliding window, freq map, shrink when valid”。结果 10 天后忘得一干二净 💀。
Real‑world analogy: 你在做饭。你手头有一长串可用的食材(即 s)。你的目标是找出最小的一段可用食材,使其仍然包含所有需要的东西。
于是你:
- 不断挑选食材
- 检查:“我有没有全部?”
- 如果有 → 尝试去掉多余的部分
- 持续收缩,直到恰好够用
这正是“扩展 → 满足 → 收缩 → 优化”,但感觉更像常识,而不是某种“技巧”。
What I’m Trying to Get At
也许问题不在于练习不足或记忆力差。也许是:
“我在试图记住从未真正经历过的模式。”
The Shift I Want to Try
与其问:
“这是哪种模式?”
不如问:
“这在现实生活中会出现在什么地方?”
我还不知道这样是否有效,但感觉比不停刷同一张表、每次面试前重新开始,或是假装自己“懂”却在之后记不起来要好得多。
我会用更多题目来尝试这个方法。最坏的情况:什么都不改变。
如果你也尝试过类似的方法并且有效,请在评论里告诉我!