最远曼哈顿距离求解问题

在刷力扣题目时遇到一个绝对值求和问题,刚开始用两重循环虽然可以解决大部分问题但是毕竟是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;
    }

[内存消耗好像有点大]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值