给定 m
个数组,每个数组都已经按照升序排好序了。
现在你需要从两个不同的数组中选择两个整数(每个数组选一个)并且计算它们的距离。两个整数 a
和 b
之间的距离定义为它们差的绝对值 |a-b|
。
返回最大距离。
示例 1:
输入:[[1,2,3],[4,5],[1,2,3]] 输出:4 解释: 一种得到答案 4 的方法是从第一个数组或者第三个数组中选择 1,同时从第二个数组中选择 5 。
示例 2:
输入:arrays = [[1],[1]] 输出:0
提示:
m == arrays.length
2 <= m <= 105
1 <= arrays[i].length <= 500
-104 <= arrays[i][j] <= 104
arrays[i]
以 升序 排序。- 所有数组中最多有
105
个整数。
思路:
线性遍历输入数组,由于每个数组是严格递增的,所以对于每个当前数组,如果我们已知之前的最小值和最大值,则可以快速求出当前的最大距离 = max(abs(arr[-1] - min), abs(arr[0] - max))
abs(arr[-1] - min) 对应的是以右端点构成的最大距离的情况,
abs(arr[0] - max) 对应的是以左端点构成的最大距离的情况。
时间复杂度:O(N)
空间复杂度:O(1)
class Solution:
def maxDistance(self, arrays: List[List[int]]) -> int:
# find min and max, then compare max(array[-1] - min, arrary[0] - max)
if not arrays:
return 0
minn, maxx = arrays[0][0], arrays[0][-1]
res = -inf
for i, arr in enumerate(arrays):
if i:
res = max(res, max(abs(arr[-1] - minn), abs(arr[0] - maxx)))
minn = min(minn, arr[0])
maxx = max(maxx, arr[-1])
return res