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:

  1. Each given array will have at least 1 number. There will be at least two non-empty arrays.
  2. The total number of the integers in all the m arrays will be in the range of [2, 10000].
  3. 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;
}
};

  

  

All LeetCode Questions List 题目汇总

最新文章

  1. Matlab读取数据中出现的问题
  2. js 判断pc端或手机端
  3. ArcGIS ElementLayer上放置Windows控件
  4. Objective-C语言Foundation框架
  5. 再次尝试mtk线刷时发现的一些资源
  6. c#使用MethodInvoker解决跨线程访问控件
  7. git bash【初级入门篇】
  8. Ubuntu 下 JDK+Tomcat+MySql 环境的搭建
  9. spring 入门笔记(一)
  10. python2 urllib2抓取51job网的招聘数据
  11. Android 源代码结构
  12. js获取HTML DOM节点元素方法总结
  13. SIMTRACE环境搭建
  14. pyqt5 添加属性-类方法用属性形式访问
  15. smb与samba
  16. [Docker] Linking Node.js and MongoDB Containers
  17. HDU 2136 Largest prime factor (素数打表。。。)
  18. angr 学习笔记
  19. swift实现一个对象池
  20. linux的几个发行网站

热门文章

  1. mac随笔
  2. 编程小白入门分享四:Vue的安装及使用快速入门
  3. C++中的类所占内存空间总结(转)
  4. lis框架showoncodename的用法
  5. 01背包问题(dfs+剪枝)
  6. 使用WinDbg调试入门(内核模式)
  7. cube.js 学习 cube docker-compose 运行
  8. 认识Nodejs
  9. CSS块元素
  10. 回文数 js 解法