leetcode 624. 数组列表中的最大距离 中等
给定 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 <= 10^5
1 <= arrays[i].length <= 500
-10^4 <= arrays[i][j] <= 10^4
arrays[i]
以 升序 排序。- 所有数组中最多有
10^5
个整数。
分析:由于数组已经按照升序排好序了,所以每一行的最大最小值分别处于这一行的末尾和开头。从第一行开始遍历整个数组,用maxn和mini记录全局的最大最小值。从第二行开始,每次进入新的一行时,分别计算当前行的最大值减去mini和maxn减去当前行的最小值,此时得到的较大值是一个可能的答案,并且不会因为最大值或最小值在同一行而不符合要求。将这个可能的答案与之前得到的答案相对比,保留较大值。遍历完整个数组即可得到答案。
int maxDistance(int** arrays, int arraysSize, int* arraysColSize) {
int mini=arrays[0][0],maxn=arrays[0][arraysColSize[0]-1],ans=-1;
for(int i=1;i<arraysSize;++i)
{
ans=fmax(ans,fmax(fabs(arrays[i][0]-maxn),fabs(arrays[i][arraysColSize[i]-1]-mini)));
maxn=fmax(maxn,arrays[i][arraysColSize[i]-1]),mini=fmin(arrays[i][0],mini);
}
return ans;
}