题目重点:针对 max|a[i]-a[j]| 训练,证明等于最大值减最小值,不混入索引差。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 仅有最大 absolute difference 描述,完整公式未提供。本文明确训练 max
- a[i]-a[j]
- ,i≠j、至少两项。
- 如题目包含
- i-j
- 或其他数组,不能直接用本解,需补齐公式。
解题路线
- 任意两值都位于 [min,max],绝对差不超过 max-min。选择取得两端的项就能达到该上界,故最优等于极差。
- 单遍维护 min/max,负数和重复值无需额外分支。全相等时结果0,仍可以选不同位置。
- O(n²)枚举作为独立参考,不作为大规模主解。要输出索引,维护两个极值位置并遵守平局规则。
- 若只有一项且允许 i=j,可以0;本文要求不同位置所以拒绝,不能含糊处理。
手动走一遍
[-5,3,3,8] 最大差13,选择-5与8。[2,2]结果0;包含索引距离的版本在全相等数组也可能非零,说明其不是同一合同。
Python 参考实现
下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。
代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。
def largest_pair_difference(values):
"""Max |a[i]-a[j]| over distinct positions; no index-distance term."""
if len(values) < 2:
raise ValueError('at least two values required')
smallest = largest = values[0]
for value in values[1:]:
smallest = min(smallest, value)
largest = max(largest, value)
return largest - smallest
复杂度
O(n) 时间、O(1) 工作空间;整数值范围的位数另算。
易错点与追问
容易失分的边界
- 把含索引差公式也套极差。
- 无不同位置却返回0。
- 绝对值枚举重复浪费时间。
继续深挖
- 若目标加上
- i-j
- 怎样分拆符号?
- 要返回全部最优配对有多少输出?
