算法选择题:双指针与滑动窗口(5 题)
026 用相向双指针在数组中找满足条件的元素组合(如两数之和),前提条件是什么?
难度: 基础
- A. 数组有序或其他单调关系才能证明移动某一侧不会漏解;无序输入不能仅根据当前和决定移动方向
- B. 相向双指针适用于任意无序数组
- C. 双指针与预处理无关,任何情况下都无需排序
- D. 只要使用了两个下标,就自动得到线性正确算法
查看答案与解析
正确答案A
正确原因: 有序性或其他单调关系才能证明移动一侧不会漏解;无序输入不能仅根据当前和决定移动方向。
错误选项辨析: B 项:无序时无法根据当前和判断应移动哪一侧;C 项:相向双指针通常以排序或其他单调关系为前提;D 项:缺少有序性或单调关系时,移动指针可能跳过正确组合。
027 求最长无重复字符子串时,窗口左边界应如何移动?
难度: 进阶
- A. 发现重复时直接清空窗口重新开始
- B. 左边界可以自由左右移动,不影响正确性
- C. 发现重复字符时直接令 left 等于旧重复位置加一
- D. 左边界只能向右移动;发现重复时 left 应取当前左边界与旧重复位置加一的较大者,不能把 left 拉回左侧
查看答案与解析
正确答案D
正确原因: 最长无重复子串中左边界只能向右移动;旧重复位置在窗口左侧时不能把 left 拉回去。
错误选项辨析: A 项:清空会丢失当前合法窗口,可能漏掉更优解;B 项:滑动窗口要求左边界单调向右,回退会破坏已扫描区间的结论;C 项:旧重复位置可能已在窗口左侧,直接赋值会把 left 拉回,导致窗口内重新出现重复。
028 为什么“和满足某条件的连续子数组”不能一律使用可变滑动窗口?
难度: 进阶
- A. 任意连续子数组求和问题都能用同一滑动窗口模板
- B. 可变窗口的收缩依赖窗口和随长度单调变化;存在负数时移除左端元素可能让窗口和增大,滑动窗口会失效
- C. 滑动窗口对所有输入都保证正确,包括负数
- D. 负数只会让窗口和变小,不影响收缩判断
查看答案与解析
正确答案B
正确原因: 依赖窗口和单调变化的收缩策略通常要求元素非负;存在负数时移除左端可能让窗口和增大。
错误选项辨析: A 项:含负数时窗口和不随收缩单调变化,模板的前提不成立;C 项:滑动窗口的正确性依赖单调性前提,负数破坏该前提;D 项:移除负数会让窗口和变大,与预期方向相反。
029 固定长度 k 的窗口向右滑动时,如何增量更新窗口内元素和?
难度: 进阶
- A. 只需加入右端元素,无需移除左端元素
- B. 每个窗口都重新遍历求和,成本更低
- C. 右端加入新元素时同步移除离开窗口的左端元素,O(1) 更新;窗口长度不合法时应先按契约处理
- D. 固定窗口必须用前缀和预处理才能保证正确
查看答案与解析
正确答案C
正确原因: 右端加入新元素时同步移除离开窗口的左端元素;窗口长度非法时必须先按契约处理。
错误选项辨析: A 项:不移除左端会让窗口和与真实窗口内容不一致;B 项:每步重新遍历是 O(k),增量更新只需 O(1);D 项:增量更新同样正确且常数更小,前缀和不是唯一方案。
030 三数之和去重时,哪种做法最稳妥?
难度: 综合
- A. 排序后无需处理重复值,直接枚举所有组合
- B. 排序后固定一个元素,用双指针扫描,并分别跳过固定值与左右指针的重复值;去重必须在记录答案后移动到新的值
- C. 找到一组答案后立即退出,即可覆盖所有情况
- D. 用 HashSet 保存结果即可,不需要在指针层去重
查看答案与解析
正确答案B
正确原因: 排序后固定一个元素,并分别跳过固定值与双指针的重复值;去重必须在记录答案后移动到新的值。
错误选项辨析: A 项:不跳过重复值会产生重复三元组;C 项:一个固定值可能对应多组答案,提前退出会漏解;D 项:只靠结果集去重仍会做大量无效扫描,指针层去重能同时保证正确与效率。