LeetCode 1131.绝对值表达式的最大值(曼哈顿距离 简单易懂)

题目描述 难度中等
在这里插入图片描述
题解 时间复杂度O(n)

看一眼时间复杂度,用暴力肯定超时,仔细想想可以把这个题抽象为求三维曼哈顿距离的最大值

d i s t = x i x j + y i y j + z i z j dist = |x_i - x_j| + |y_i - y_j| + |z_i - z_j|
分析:

  • dist这个表达式去绝对值后, x i y i z i x_i,y_i,z_i 只可能有八种情况 1 x i + y i + z i 2 x i + y i z i , . . . 8 x i y i z i 1:x_i + y_i + z_i,2:x_i + y_i - z_i, ...,8:-x_i - y_i - z_i
  • 可以发现每一种情况对应的 x j , y j , z j x_j, y_j, z_j , 一定也能被确定下来(对应符号相反),比如: x i + y i z i x_i + y_i - z_i 这种情况,一定是 d i s t = ( x i + y i z i ) + ( x j y j + z j ) dist = (x_i + y_i - z_i)+(-x_j - y_j + z_j)
  • 所以我们只需要先用 O ( n ) O(n) 的复杂度求出点 i i 的八种情况分别对应的最大值 m a x v [ k ] , k = 0 , . . 8 maxv[k], k=0,..8 ,然后再用 O ( n ) O(n) 的复杂度枚举每一种去绝对值的组合,取八种组合中的最大值即为最终结果
  • 进一步可以求d维的曼哈顿距离,情况有 2 d 2^d 种,时间复杂度为 O ( 2 d n ) O(2^d n)
    C++代码:
class Solution {
public:
    // 八种情况,用1表示正号,-1表示负号
    int d[8][3] = {{1, 1, 1}, {1, 1, -1}, {1, -1, 1}, {-1, 1, 1}, {1, -1, -1}, {-1, -1, 1}, {-1, 1, -1}, {-1, -1, -1}};
    int maxv[8];

    int maxAbsValExpr(vector<int> &arr1, vector<int> &arr2) {
        int n = arr1.size();
        memset(maxv, 0x80, sizeof maxv);

        // 求出点i的8种组合的最大值
        for (int k = 0; k < 8; k ++)
            for (int i = 0; i < n; i ++)
                maxv[k] = max(maxv[k], i * d[k][0] + arr1[i] * d[k][1] + arr2[i] * d[k][2]);

        int res = 0;
        for (int k = 0; k < 8; k ++)
            for (int j = 0; j < n; j ++)
                res = max(res, maxv[k] - j * d[k][0] - arr1[j] * d[k][1] - arr2[j] * d[k][2]);

        return res;
    }
};
发布了182 篇原创文章 · 获赞 71 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_43827595/article/details/104080592