# 1. 三数之和(15)如何排序+双指针+去重避免超时 A 排序会破坏双指针正确性 B 双指针无法在有序数组上找两数和 C 排序后固定 i 用双指针在右侧找两数和,并跳过重复值去重,O(n²) ✓ 正确答案 D 用三重循环暴力即可,不需要排序
# 2. 为什么三数之和要先排序而非用哈希(去重与复杂度权衡) A 哈希法比排序法更快且去重更简单 B 排序会增加复杂度到 O(n² log n) C 排序使双指针可行且去重只需跳过相同值,比哈希法去重更方便 ✓ 正确答案 D 排序后无法用双指针
# 3. 前缀和与差分的互逆关系及恢复原数组的扫描方式 A 差分数组的前缀和是差分数组本身 B 前缀和与差分完全没有关系 C 前缀和与差分互为逆运算,差分数组做一次前缀和扫描即可恢复原数组 ✓ 正确答案 D 恢复原数组需要排序
# 4. 前缀和配合哈希表统计"和为 K 的子数组个数"(560) A 用哈希表记录前缀和出现次数,对每个位置累加 map[prefix[i]-K],O(n) ✓ 正确答案 B 需要先排序再统计 C 必须枚举所有子数组 O(n²) D 前缀和无法用于子数组计数
# 5. 有序数组合并/区间交集如何用双指针线性扫描 A 双指针分别指向两序列,依序比较移动,指针单调前进,O(m+n) ✓ 正确答案 B 指针会反复回退 C 双指针只能用于合并,不能求交集 D 需要二分查找才能合并
# 6. 滑动窗口中位数/第 K 大(结合平衡树或双堆) A 用双堆(延迟删除)或平衡树维护有序集合,插入删除 O(log k),总 O(n log k) ✓ 正确答案 B 中位数无需维护有序集合 C 双堆无法处理删除 D 单调队列可以 O(n) 求中位数
# 7. 用前缀和 O(1) 求任意子数组和及如何避免越界处理 A 前缀和查询需要 O(n) B 用 p[0]=0 作哨兵,子数组 [l,r] 和 = p[r+1]-p[l],避免 l=0 越界 ✓ 正确答案 C 前缀和只能求前缀,不能求任意子数组 D 必须特判 l=0 的情况
# 8. 最小覆盖子串(76)如何用 need/found 双计数精确收缩 A 只能扩展不能收缩 B 不需要记录 matched,直接比较即可 C 每次收缩都重新比较两个哈希表 D 用 matched 记录已满足需求的字符种类数,收缩时仅当字符需求跌破才更新 matched ✓ 正确答案
# 9. 统计"无重复字符的最长子串"(3)如何用 last 哈希 O(n) A last 哈希只能从左往右不能从右往左 B 用 last 记录字符最近位置,遇到重复时左指针直接跳到重复位置之后,O(n) ✓ 正确答案 C 遇到重复必须逐个收缩左指针 D 需要 O(n²) 枚举所有子串
# 10. 为什么统计子数组和为 K 时要用"前缀和出现次数"而非枚举 A 枚举子数组也是 O(n) 可行 B 前缀和无法用于计数 C 哈希统计只适用于和为 0 D 子数组和=前缀和之差,用哈希统计前缀和出现次数降至 O(n),避免 O(n²) 枚举 ✓ 正确答案
# 11. 前缀和取模(同余)在"可被 K 整除子数组"中的运用 A 负数取模无关紧要 B 需要枚举所有子数组验证整除 C 同余只适用于和为 0 D 子数组和可被 K 整除等价于两前缀和同余,用桶统计相同余数出现次数,O(n) ✓ 正确答案
# 12. 前缀和数组下标偏移(+1)技巧对处理空前缀的帮助 A 偏移只影响求和不影响计数 B 偏移 +1 会让查询越界 C p[0]=0 表示空前缀,使 l=0 的子数组无需特判,计数时 map[0]=1 借助空前缀 ✓ 正确答案 D 空前缀无法参与计数
# 13. 平方有序数组(977)双指针从两端取极值归并 A 双指针无法处理负数 B 平方后最大值在两端,双指针从两端取绝对值较大者填入结果末尾,O(n) ✓ 正确答案 C 最大值在数组中间 D 平方后直接排序即可,复杂度 O(n)
# 14. 盛最多水的容器(11)双指针按"短板决定水量"的贪心推进 A 每次移动较高一侧指针 B 必须枚举所有点对 O(n²) C 每次移动较矮一侧指针,因为移动较高侧 min 不变且宽度减小不可能更优 ✓ 正确答案 D 水量由较高一侧决定
# 15. 有序数组两数之和(167)双指针收缩的正确性与单调性依据 A 和大于目标时右指针左移、小于时左指针右移,单调收缩保证不遗漏解 ✓ 正确答案 B 和大于目标时左移左指针 C 必须先二分查找 D 双指针在有序数组上也能错乱
# 16. 滑动窗口与位掩码结合处理"子数组 OR 值≥目标"类题 A OR 值随窗口扩大单调递减 B 用位计数数组维护窗口内每位为 1 的个数,窗口移动时 O(位数) 更新 OR 值 ✓ 正确答案 C OR 值可以像和一样用加减维护 D 位掩码无法用于 OR 问题
# 17. 一维差分如何实现"区间 [l,r] 全部加 v"的 O(1) 标记 A 差分只能做区间查询不能做更新 B 每次更新都要重新计算整个数组 C 区间 [l,r] 加 v 只需 d[l]+=v 且 d[r+1]-=v,最后一次前缀和还原 ✓ 正确答案 D 需要遍历区间内每个元素加 v
# 18. 为什么最小覆盖子串收缩时要先判断"该字符仍必需"再移动 A 只要窗口合法就随意收缩 B 收缩时不需要判断字符必需性 C 先判断该字符是否仍必需(移除后会否跌破需求),再决定移动与更新 matched ✓ 正确答案 D 移除任何字符都更新 matched
# 19. 含通配符的子串匹配如何用窗口+频率表处理 '?' 与 '*' A '*' 不能被拆分 B 通配符匹配必须用动态规划,无法用窗口 C '?' 只能匹配固定字符 D 用 '*' 把模式拆成普通段,段内用窗口+频率表匹配('?' 可任意),段间顺序匹配 ✓ 正确答案
# 20. 字符串排列(567)窗口长度固定时的判定优化 A 定长窗口无法判断排列 B 用定长窗口 + 频率表 + 匹配字符数变量,O(1) 更新和判断,整体 O(n) ✓ 正确答案 C 需要每次重新统计整个窗口频率 D 必须对 s2 排序
# 21. 最长连续 1(限翻转 K 个 0)如何用窗口内 zero 计数控制 A 把问题化为"窗口内 0 的个数 ≤ K",右扩左缩维护 zero 计数,O(n) ✓ 正确答案 B 用 zero 计数但无法控制窗口 C 窗口内 0 的个数必须等于 0 D 需要实际翻转并记录
# 22. 统计所有"恰好 K 个"子串的数量而非仅找最大值 A 恰好 K 个无法统计,只能找最大值 B 直接用暴力枚举恰好 K 个 C 用 atMost(K) - atMost(K-1),atMost 用滑动窗口 O(n) 统计 ✓ 正确答案 D atMost(K) + atMost(K-1) 才是恰好 K 个
# 23. 统计满足"子串中每种字符出现次数≥某阈值"的个数 A 枚举子串包含的字符种数 k,对每个 k 用滑动窗口维护计数并判定,O(26×n) ✓ 正确答案 B 无法统计,只能找最长 C 必须用哈希比较 D 不需要枚举字符集
# 24. 至少有 K 个重复字符的最长子串如何用分治+计数结合 A 分治无法求解该问题 B 出现次数 < K 的字符可以出现在答案中 C 必须用滑动窗口 D 用出现次数 < K 的字符切分字符串,递归处理各段,段内无坏字符则整段合法 ✓ 正确答案
# 25. 如何在滑动窗口中维护"不同元素个数/最大频率"两类信息 A maxFreq 增加时无法更新 B distinct 每次都要重新统计 C 两者都能 O(1) 更新 D distinct 在计数跨 0↔1 时 O(1) 更新;maxFreq 减少时常用频率分布表/平衡树维护 ✓ 正确答案
# 26. 对撞指针与快慢指针的语义区分及各自典型场景 A 两者都是对撞 B 对撞指针从两端向中间收敛(两数之和/回文),快慢指针同向差速(链表找环/中点) ✓ 正确答案 C 对撞指针用于链表找环 D 快慢指针用于有序数组求两数之和
# 27. 四数之和如何在外层固定后复用三数之和框架并继续剪枝 A 无法去重 B 复杂度是 O(n²) C 排序后固定两个数,再用双指针找后两个,复用三数之和框架,O(n³) 并剪枝去重 ✓ 正确答案 D 不需要排序
# 28. 多条件(长度≥L 且不同字符≤K)窗口如何定义合法 A 约束之间不能组合 B 硬约束(如不同字符≤K)控制收缩,软约束(如长度≥L)控制更新答案,组合判定 ✓ 正确答案 C 所有约束都必须用于收缩 D 多条件无法用滑动窗口
# 29. 如何用"异位词"窗口思想解决变体(允许 K 处不同) A 把"差异数=0"放宽为"差异数≤K",用频率表 O(1) 维护差异数 ✓ 正确答案 B 差异数必须重新计算 C 只需要比较首尾字符 D K 处不同无法用窗口判定
# 30. 差分在"多次区间更新后求点值"场景相比线段树的优势 A 差分总是比线段树好 B 线段树比差分更新更快 C 只需批量更新后求点值时差分 O(1) 更新 + O(n) 还原,比线段树更简单高效 ✓ 正确答案 D 差分无法批量更新
# 31. 按位运算约束(如 XOR 恰好)的窗口如何维护前缀异或 A 异或不可逆,无法用前缀 B 异或前缀无法用于计数 C 需要枚举所有子数组 D 子数组异或 = pre[r]^pre[l-1],用哈希统计 pre[r]^K 出现次数,O(n) ✓ 正确答案
# 32. 窗口内维护"元素种类数"与"每种计数"的两张表如何协同 A cnt 跨 0↔1 边界时才更新 distinct,两表同步一致 ✓ 正确答案 B 计数表不需要 distinct C 两张表完全独立,无需同步 D distinct 每次重新统计