断断续续在OJ上刷题也有快两年了,从最开始连多组输入都不太会处理,到后来能静下心把一道中等难度的题完整想清楚再动手,中间走过的弯路真不算少。这篇“OJ题(2)”是第二阶段刷题的一个记录,重点想聊一聊比“会不会做”更值钱的那部分经验:边界条件怎么抠、时间复杂度和内存怎么估算、一道题到底是“模拟”还是“图论建模”、提交超时以后又该从哪里下手,以及不同OJ平台之间那些容易让人忽略的差异。
如果你正在准备算法比赛、暑期实习的在线笔试,或者单纯想把算法基础打得扎实一点,这篇文章应该能帮上忙。我不会去复述某道题的具体题解,因为那是“授人以鱼”的事;我更想把做题过程中那些不太会出现在文档里、但几乎天天都踩的东西摊开讲清楚,比如为什么样例过了还是WA、为什么本地一秒跑完提交却TLE、什么时候该用二分而不是哈希。这些都是偏“实战向”的细节,能让你少走很多弯路。
1. 为什么说“做题数量”是最容易被高估的东西
很多新手一上来就给自己定目标:这个月刷50道,下个月刷100道,好像刷得越多就越厉害。我在刚开始刷OJ的时候也是这种心态,总觉得只要量大,水平自然就上去了。但刷到后面发现问题没这么简单——数量只能代表你“见过”很多题,不代表你能在笔试或者比赛里稳定做出来。真正拉开差距的,是你拿到一道陌生题之后的分析过程是否清晰,以及你对自己写出来的代码有没有足够的掌控力。
1.1 每一次提交背后都藏着一组约束条件
OJ题和平时写业务代码最大的区别在于“约束条件”是显性的。题目会告诉你有多少组数据、数据范围有多大、时间和内存限制是多少,这些不是摆设,它们直接决定了你要采用哪种算法。
举个例子,如果一道题的数据范围是 n ≤ 10^5,那么 O(n^2) 的写法在大多数OJ上都会超时,你需要往 O(n log n) 甚至 O(n) 去靠。如果 n 只有 100,那两层甚至三层循环都基本没问题。我早期做题的习惯是直接跳到“用什么数据结构”这一步,完全忽略了数据规模,结果就是思路本身没错,代码写出来却怎么都过不了。
后来我要求自己每次读题先画一个“规模到算法”的映射表:看到 10^5 想到排序、二分、线段树、前缀和;看到 10^3 可以接受 O(n^2) 的DP或 Floyd;看到个位数范围往往要考虑状态压缩或暴搜。这种条件反射花不了多少时间,却能让你在选算法的时候少走很多弯路,也不至于辛辛苦苦写完一个O(n^2)的暴力才发现题目根本不给你这个复杂度空间。
1.2 复盘比开新题更有价值
刷题数量上不去往往是因为时间都花在“开新题”上,而真正让水平提升的关键其实是对已经做过的题进行复盘。我现在的习惯是,每做完一道有价值的题,会在代码仓库里记一段简短备注,包括用到的套路、踩过的坑、有没有更优解。这比AC数好看有用得多。
比如“区间询问、离线处理”这类题,如果第一次接触时只是对着题解敲一遍,那基本等于白做。可如果你能总结出“什么信号出现的时候应该往分块或莫队上想”“离线排序的思路为什么能降低复杂度”,下次再遇到类似题就会有一种似曾相识的直觉。这种直觉不是天赋,而是大量复盘堆出来的模式识别。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 多数人都会栽跟头的四类OJ坑
光有做题流程还不够,做题过程中那些藏在细节里的坑才是真实消耗时间的地方。我总结下来,最容易让人从“我觉得没问题”到“WA到怀疑人生”的坑,大
