
题目描述
给定 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
个整数。
解法
方法一:维护最大值和最小值
我们注意到,最大距离一定是两个数组中的一个最大值和另一个最小值之间的距离。因此,我们可以维护两个变量 \(\textit{mi}\) 和 \(\textit{mx}\),分别表示已经遍历过的数组中的最小值和最大值。初始时 \(\textit{mi}\) 和 \(\textit{mx}\) 分别为第一个数组的第一个元素和最后一个元素。
接下来,我们从第二个数组开始遍历,对于每个数组,我们首先计算当前数组的第一个元素和 \(\textit{mx}\) 之间的距离,以及当前数组的最后一个元素和 \(\textit{mi}\) 之间的距离,然后更新最大距离。同时,我们更新 \(\textit{mi} = \min(\textit{mi}, \textit{arr}[0])\) 和 \(\textit{mx} = \max(\textit{mx}, \textit{arr}[\textit{size} - 1])\)。
遍历结束后,即可得到最大距离。
时间复杂度 \(O(m)\),其中 \(m\) 为数组的个数。空间复杂度 \(O(1)\)。
| class Solution:
def maxDistance(self, arrays: List[List[int]]) -> int:
ans = 0
mi, mx = arrays[0][0], arrays[0][-1]
for arr in arrays[1:]:
a, b = abs(arr[0] - mx), abs(arr[-1] - mi)
ans = max(ans, a, b)
mi = min(mi, arr[0])
mx = max(mx, arr[-1])
return ans
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | class Solution {
public int maxDistance(List<List<Integer>> arrays) {
int ans = 0;
int mi = arrays.get(0).get(0);
int mx = arrays.get(0).get(arrays.get(0).size() - 1);
for (int i = 1; i < arrays.size(); ++i) {
var arr = arrays.get(i);
int a = Math.abs(arr.get(0) - mx);
int b = Math.abs(arr.get(arr.size() - 1) - mi);
ans = Math.max(ans, Math.max(a, b));
mi = Math.min(mi, arr.get(0));
mx = Math.max(mx, arr.get(arr.size() - 1));
}
return ans;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | class Solution {
public:
int maxDistance(vector<vector<int>>& arrays) {
int ans = 0;
int mi = arrays[0][0], mx = arrays[0][arrays[0].size() - 1];
for (int i = 1; i < arrays.size(); ++i) {
auto& arr = arrays[i];
int a = abs(arr[0] - mx), b = abs(arr[arr.size() - 1] - mi);
ans = max({ans, a, b});
mi = min(mi, arr[0]);
mx = max(mx, arr[arr.size() - 1]);
}
return ans;
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | func maxDistance(arrays [][]int) (ans int) {
mi, mx := arrays[0][0], arrays[0][len(arrays[0])-1]
for _, arr := range arrays[1:] {
a, b := abs(arr[0]-mx), abs(arr[len(arr)-1]-mi)
ans = max(ans, max(a, b))
mi = min(mi, arr[0])
mx = max(mx, arr[len(arr)-1])
}
return ans
}
func abs(x int) int {
if x < 0 {
return -x
}
return x
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13 | function maxDistance(arrays: number[][]): number {
let ans = 0;
let [mi, mx] = [arrays[0][0], arrays[0].at(-1)!];
for (let i = 1; i < arrays.length; ++i) {
const arr = arrays[i];
const a = Math.abs(arr[0] - mx);
const b = Math.abs(arr.at(-1)! - mi);
ans = Math.max(ans, a, b);
mi = Math.min(mi, arr[0]);
mx = Math.max(mx, arr.at(-1)!);
}
return ans;
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | impl Solution {
pub fn max_distance(arrays: Vec<Vec<i32>>) -> i32 {
let mut ans = 0;
let mut mi = arrays[0][0];
let mut mx = arrays[0][arrays[0].len() - 1];
for i in 1..arrays.len() {
let arr = &arrays[i];
let a = (arr[0] - mx).abs();
let b = (arr[arr.len() - 1] - mi).abs();
ans = ans.max(a).max(b);
mi = mi.min(arr[0]);
mx = mx.max(arr[arr.len() - 1]);
}
ans
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | /**
* @param {number[][]} arrays
* @return {number}
*/
var maxDistance = function (arrays) {
let ans = 0;
let [mi, mx] = [arrays[0][0], arrays[0].at(-1)];
for (let i = 1; i < arrays.length; ++i) {
const arr = arrays[i];
const a = Math.abs(arr[0] - mx);
const b = Math.abs(arr.at(-1) - mi);
ans = Math.max(ans, a, b);
mi = Math.min(mi, arr[0]);
mx = Math.max(mx, arr.at(-1));
}
return ans;
};
|