Description

给定两个数组arr1arr2,求max{ arr1iarr1j+arr2iarr2j+ij }

Constraints

时间复杂度不超过O(n)

Solution

这道题就是求三维的曼哈顿距离,每一个点i的坐标是(xi,yi,zi)(arr1i,arr2i,i)的形式

计算公式在未展开时为Δx+Δy+Δz

展开后为(Axi+Bxj)+(Cyi+Dyj)+(Ezi+Fzj),其中:

{A+B=0C+D=0E+F=0A,B,C,D,E,F{1,1}

因此,把{A,C,E}的8种情况列举出来就好处理了

每种情况的遍历过程可以算出Axi+Cyi+EziBxj+Dyj+Fzj

Code

class Solution {
public:
    int maxAbsValExpr(vector<int>& arr1, vector<int>& arr2) {
        constexpr int d[][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 ans {};
        for(auto &d : d) {
            int mx {-1<<30}, mn {-mx};
            for(int i = 0; i < arr1.size(); ++i) {
                auto v = d[0] * arr1[i] + d[1] * arr2[i] + d[2] * i;
                // {ACE}
                mx = max(mx, v);
                // -{BDF}
                mn = min(mn, v);
            }
            // {ACE} + {BDF}
            ans = max(ans, mx - mn);
        }
        return ans;
    }
};

LeetCode-1131 Maximum of Absolute Value Expression