边界条件思考
LeetCode Hot 100
为什么要系统性检查边界条件
边界条件的本质是:输入规模、窗口范围、索引合法性是否被完整覆盖。常见问题来自:
- 空输入 / 空字符串
- 单元素 / 最小窗口
- 窗口刚好满足条件
- 计数回退导致的 off-by-one
- 排序 / 哈希 / 计数数组的索引越界
通用检查清单
- 长度关系:t.length() > s.length() 直接返回
- 窗口初始化:k == 1 或 k == nums.length
- 索引范围:i - k + 1 不可为负
- 计数回退:移出窗口时先恢复计数,再判断是否满足
- 返回默认值:未更新最优解时返回空或初始化值
典型题型要点
比如 k是窗口大小,i 是当前索引,那么窗口的左边界是 i - k + 1,右边界是 i。
通过画图,i-k是去掉窗口大小后的索引,+1 是因为窗口是包含右边界的。
滑动窗口
- 右指针推进后先更新计数,再判断是否满足
- 左指针收缩时先恢复计数,再判断是否失效
- 记录答案时注意区间长度 right - left + 1
前缀和 / 哈希
- sum 从 0 开始,map 需要预置 0 -> 1
- 防止重复计数:先查询,再更新
单调队列
- 过期元素判断:index < i - k + 1
- 队列维护:入队前移除不可能成为最大值的元素
示例:最小覆盖子串的边界
- t 为空时,可直接返回空串
- s 为空时,直接返回空串
- required 计数必须与 need 更新顺序一致
- 最优答案初始化为 MAX,未更新则返回空串
总结
边界条件判断的核心是先定义合法范围,再保证每次状态转移都保持合法。
一旦出现 off-by-one,优先回看:索引边界、更新顺序、窗口长度计算。