[LeetCode] 624. Maximum Distance in Arrays 数组中的最大距离
Given m
arrays, and each array is sorted in ascending order. Now you can pick up two integers from two different arrays (each array picks one) and calculate the distance. We define the distance between two integers a
and b
to be their absolute difference |a-b|
. Your task is to find the maximum distance.
Example 1:
Input: [[1,2,3], [4,5], [1,2,3]] Output: 4 Explanation: One way to reach the maximum distance 4 is to pick 1 in the first or third array and pick 5 in the second array.
Note:
- Each given array will have at least 1 number. There will be at least two non-empty arrays.
- The total number of the integers in all the
m
arrays will be in the range of [2, 10000]. - The integers in the
m
arrays will be in the range of [-10000, 10000].
给m个数组, 每个数组按升序排列。现在你可以从2个不同的数组中各取1个数字,计算他们的距离,距离是两个数值差的绝对值。任务是找出最大距离。
注意要从不同数组中取数,那么即使某个数组的首尾差距很大,也不行。
解法1:最大堆和最小堆。空间复杂度高。
解法2:用min_val和max_val表示当前遍历到的数组中最小的首元素和最大的尾元素,当遍历到一个新的数组时,计算新数组尾元素和min_val绝对差以及max_val和新数组首元素的绝对差,取较大值和result比较来更新结果,最后返回result。
Java:
public class Solution { public int maxDistance(int[][] list) { int res = 0, min_val = list[0][0], max_val = list[0][list[0].length - 1]; for (int i = 1; i < list.length; i++) { res = Math.max(res, Math.max(Math.abs(list[i][list[i].length - 1] - min_val), Math.abs(max_val - list[i][0]))); min_val = Math.min(min_val, list[i][0]); max_val = Math.max(max_val, list[i][list[i].length - 1]); } return res; } }
Python:
# Time: O(n) # Space: O(1) class Solution(object): def maxDistance(self, arrays): """ :type arrays: List[List[int]] :rtype: int """ result, min_val, max_val = 0, arrays[0][0], arrays[0][-1] for i in xrange(1, len(arrays)): result = max(result, max(max_val - arrays[i][0], arrays[i][-1] - min_val)) min_val = min(min_val, arrays[i][0]) max_val = max(max_val, arrays[i][-1]) return result
C++:
class Solution { public: int maxDistance(vector<vector<int>>& arrays) { priority_queue<pair<int, int>> mx, mn; for (int i = 0; i < arrays.size(); ++i) { mn.push({-arrays[i][0], i}); mx.push({arrays[i].back(), i}); } auto a1 = mx.top(); mx.pop(); auto b1 = mn.top(); mn.pop(); if (a1.second != b1.second) return a1.first + b1.first; return max(a1.first + mn.top().first, mx.top().first + b1.first); } };
C++:
class Solution { public: int maxDistance(vector<vector<int>>& arrays) { int res = 0, start = arrays[0][0], end = arrays[0].back(); for (int i = 1; i < arrays.size(); ++i) { res = max(res, max(abs(arrays[i].back() - start), abs(end - arrays[i][0]))); start = min(start, arrays[i][0]); end = max(end, arrays[i].back()); } return res; } };