题目重点:OA 有点更新第二数组和查询跨数组和为 target 的有序下标 pair;重复 2 要乘频次,题目例答案为 3。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练版 update(index,newValue) 替换 B 的一个位置,A 固定;query(target) 统计所有 (i,j) 且 A[i]+B[j]=target,下标不同来源可任意组合。
- 重复值按位置重数计;A 与 B 之间的 pair 是有序角色,不能把两个数组合并后除以 2。
- 更新索引合法,数字为整数;无效更新如何报错需按实际题面。
解题路线
- 预建 countA 和 countB 频次表;点更新 B[j] 时先给旧值频次−1,若为零可删键,再替换数组元素并给新值频次+1。
- 查询遍历 distinct A 值 x,累加 countA[x]×countB[target−x];乘法自然处理重复下标。
- 若查询目标非常固定,也可维护该 target 的答案并在 B 点更新时按 A 的补数变化 O(1) 调整;若 target 可变,则保留频次表更通用。
- 用题目 A=[1,2,2]、B=[3,2]、target=4 得 1×1+2×1=3;更新 B 的 2→3 后答案变 1×2=2。
- 测试更新值等于旧值、B 某值频次降至 0、负数、空数组和多个重复值。
手动走一遍
A 的频次为 {1:1,2:2},B 为 {3:1,2:1}。target=4:1 的补数 3 贡献 1;2 的补数 2 贡献 2,共 3。若只用 set,2 的两个位置会被当成一个,错误返回 2。
规模与取舍
初始化 O(|A|+|B|) 时间、O(不同值数) 空间;B 点更新预期 O(1),单次查询 O(distinct A) 预期哈希访问。若数值范围大、哈希碰撞极端,按实现另分析。
易错点与追问
容易失分的边界
- 把重复值去重,题目例错成 2。
- B 点更新只改数组未改频次,后续查询陈旧。
- 从 B 查所有 A 位置时把同一个 A 值只算一次。
- 把跨数组角色 pair 当同数组 unordered pair。
继续深挖
- 目标 target 固定时如何 O(1) 查询?
- A/B 都允许更新怎样设计?
- 查询目标范围有限时可否预计算卷积?
- 高频读多目标的缓存失效如何做?
