题目重点:只判断值T是否在两个相距严格小于K的位置重复,避免把其他重复值或等于K的距离算进去。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 下标从0起;必须两个不同位置且值都等于T;距离严格<K。K<=1没有可能的合法重复。
- 这不是任意值重复的标准nearby duplicate,也不是距离<=K;以明确示例为准。
解题路线
- 只保存上一次T的下标。再次遇到T时,与最近位置的距离是当前T到此前所有T的最小距离;若它也不满足,更早位置均不满足。
- 不需保存窗口中全部值或建立set,因为题目只关注一个指定值。其他数字重复与答案无关。
- 无论判断是否成立,都更新最近T位置;若保留首次T会漏掉后续靠得更近的一对。
手动走一遍
[1,3,6,1,4,3],K=5/T=3,位置1与5差4返回true;[2,4,1,2,5],K=3/T=2差3返回false。
Python 参考实现
下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。
代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。
def nearby_target_duplicate(values, k, target):
"""Only repetitions of target count; distance is strictly less than k."""
previous = None
for i, value in enumerate(values):
if value == target:
if previous is not None and i - previous < k:
return True
previous = i
return False
复杂度
O(n)时间,O(1)辅助空间,可处理数据流并立即早停。
易错点与追问
容易失分的边界
- 将<写成<=会违背距离等于K的反例。
- 把所有值放set会因非T重复错误返回true。
继续深挖
- 若查询很多不同T且同K,可保存每值最近下标,单次扫描找到满足条件的值集合。
- 若要求输出全部合法pairs,可能O(n²)输出;保留最近下标不够。
