Skip to content

624. 数组列表中的最大距离

624. 数组列表中的最大距离

ts
function maxDistance(arrays: number[][]): number {
  let result = 0
  let minSoFar = arrays[0][0] // 第一个数组的最小值
  let maxSoFar = arrays[0][arrays[0].length - 1] // 第一个数组的最大值

  for (let i = 1; i < arrays.length; i++) {
    const current = arrays[i]
    const curMin = current[0]
    const curMax = current[current.length - 1]

    // 当前数组与历史最大/最小值组合出两个候选答案
    const dist1 = Math.abs(curMax - minSoFar) // 当前最大 - 历史最小
    const dist2 = Math.abs(maxSoFar - curMin) // 历史最大 - 当前最小

    result = Math.max(result, dist1, dist2)

    // 更新历史最大/最小
    minSoFar = Math.min(minSoFar, curMin)
    maxSoFar = Math.max(maxSoFar, curMax)
  }

  return result
}

隐藏条件

题干里有一个关键约束:每个数组都是已排序的。这意味着每个数组的最小值在 [0],最大值在 [length-1]

同时,最大距离的两个元素必须来自不同数组。如果忽略这个约束,直接全局找最大最小值即可。有了它,问题变成:在遍历过程中,用「历史最佳」和「当前」组合出答案。

为什么先组合再更新

顺序很重要。对于每个新数组,我们先用它的极值与之前所有数组的极值计算距离,然后再用它的极值更新历史记录。这样保证不会出现「同一个数组的两个元素」参与距离计算的情况。

遍历 O(N),空间 O(1)。这一类题的关键就是在遍历过程中维护历史极值,再和当前项组合。