超时反例与退化输入设计¶
目标:学会主动构造最坏输入,而不是只用官方样例自我感觉良好。
一、为什么要刻意设计退化输入¶
很多错误解法并不是逻辑错,而是在:
- 大规模下超时
- 极端分布下退化
- 重复值或单调序列下失效
- 高频更新下复杂度爆炸
这类问题正是线上评测和面试区分度的来源。
二、常见退化输入模板¶
1. 单调序列¶
适合打掉:
- 单调栈边界写错
- 双指针错误剪枝
- 递增/递减假设不成立
2. 全重复或大量重复¶
适合打掉:
- 哈希计数边界
- 去重逻辑
- 排序后双指针重复跳过错误
3. 极大窗口 / 极大子数组¶
适合打掉:
- 滑动窗口重复扫描
- 前缀和边界问题
4. 稀疏图 / 稠密图¶
适合打掉:
- 图算法复杂度判断错误
- 邻接矩阵与邻接表误用
三、超时反例怎么写¶
推荐模板:
Text Only
错误解法:每个窗口都重新遍历 k 个元素,复杂度 O(nk)
退化输入:n = 100000, k = 50000
结果:比较次数约 5e9,无法通过评测
正确方向:单调队列,把复杂度降到 O(n)
四、你自己的题解至少要保留什么¶
- 1 个边界输入
- 1 个退化输入
- 1 个压力输入
- 1 个容易误导人的反例
这也是后面补齐 OJ 高质量测试点时最应该优先补的四类。