zoukankan      html  css  js  c++  java
  • [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:

    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 题目汇总

  • 相关阅读:
    技巧篇:如何重写基类的事件
    技巧篇:结合反射技术实现多算法动态加密
    C语言关键字 专一王子:volatile
    第一章 C语言关键字 auto和register
    程序员的进化
    C语言关键字 铁布衫:const
    LINQ简记(3):子句
    windows phone开发之获取屏幕分辨率 和 系统版本
    windows phone开发之 listbox分页加载数据
    Windows phone 微博客户端 开发之项目总结
  • 原文地址:https://www.cnblogs.com/lightwindy/p/9699031.html
Copyright © 2011-2022 走看看