最远曼哈顿距离求解问题

在刷力扣题目时遇到一个绝对值求和问题,刚开始用两重循环虽然可以解决大部分问题但是毕竟是O(n^2)级别的时间复杂度,果不其然超时挂了,想了各种方法还是解决不了之后看大佬题解,大佬们提到了求曼哈顿距离,结合大佬们的讲解说说我的思路。
首先第一步分析出去掉绝对值符号的的几种情况。一般来说有几个绝对值号就是几维,每个去掉后都有两种情况,k维就是2的k次方;
然后分析在每个维度下所有数据的最大值和最小值,两者之差就是在这个维度下的最大距离;
最终的结果显然是所有维度下的最大值。
值得注意的是绝对值号具有对称性,因此一般我们可以固定一个维度值,这样可以减少一半的时间。时间复杂度O(n*2^k),在k比较小的情况下可以很好的解决此类问题。
附上对LeetCode1131题目的解决代码。

public int maxAbs2(int[]arr1, int[]arr2){
        int[][]direction = {{1, 1}, {1, -1}, {-1, 1}, {-1, -1},};
//                {-1, 1, 1}, {-1, 1, -1}, {-1, -1, 1}, {-1, -1, -1}};
        int []max_val = new int[direction.length];
        int []min_val = new int[direction.length];
        int res = Integer.MIN_VALUE;
        for(int i=0;i<direction.length;i++){
            max_val[i] = Integer.MIN_VALUE;
            min_val[i] = Integer.MAX_VALUE;
            for(int j=0;j<arr1.length;j++){
                int temp = arr1[j]+arr2[j]*direction[i][0]+j*direction[i][1];
                max_val[i] = Math.max(temp, max_val[i]);
                min_val[i] = Math.min(temp, min_val[i]);
            }
            res = Math.max(max_val[i]-min_val[i], res);
        }
        return res;
    }

[内存消耗好像有点大]

你可能感兴趣的:(leetCode,刷题)