题目描述:
给你两个长度相等的整数数组,返回下面表达式的最大值:
|arr1[i] - arr1[j]| + |arr2[i] - arr2[j]| + |i - j|
其中下标 i,j 满足 0 <= i, j < arr1.length。
示例 1:
输入:arr1 = [1,2,3,4], arr2 = [-1,4,5,6]
输出:13
示例 2:
输入:arr1 = [1,-2,-5,0,10], arr2 = [0,-2,-1,-7,-4]
输出:20
提示:
2 <= arr1.length == arr2.length <= 40000
-10^6 <= arr1[i], arr2[i] <= 10^6
方法1:
主要思路:解题链接汇总
(1)三维的曼哈顿距离;
(2)对每个方向上的最远的点作为中间位置,求出各个点对该中间位置的最大和最小距离,这两个距离相减,即为这些点之间相对中间点的最大距离;
(3)求出所有可能方向上的这种最大距离,在其中取出最大值;
class Solution {
public:
int maxAbsValExpr(vector<int>& arr1, vector<int>& arr2) {
//八个方向
vector<int> max_dist(8,INT_MIN);
vector<int> min_dist(8,INT_MAX);
int MAX_CORNER=1000000+1;//可以作为中间点的最远距离
//八个方向上的中间点坐标
vector<vector<int>> corners={
{MAX_CORNER,MAX_CORNER,MAX_CORNER}, {-MAX_CORNER,MAX_CORNER,MAX_CORNER},
{MAX_CORNER,-MAX_CORNER,MAX_CORNER}, {MAX_CORNER,MAX_CORNER,-MAX_CORNER},
{-MAX_CORNER,-MAX_CORNER,MAX_CORNER}, {-MAX_CORNER,MAX_CORNER,-MAX_CORNER},
{MAX_CORNER,-MAX_CORNER,-MAX_CORNER}, {-MAX_CORNER,-MAX_CORNER,-MAX_CORNER}
};
for(int i=0;i<8;++i){//每个方向
for(int j=0;j<arr1.size();++j){//所有点相对于当前方向上的中间点
max_dist[i]=max(max_dist[i],abs(corners[i][0]-arr1[j])+abs(corners[i][1]-arr2[j])+abs(corners[i][2]-j));
min_dist[i]=min(min_dist[i],abs(corners[i][0]-arr1[j])+abs(corners[i][1]-arr2[j])+abs(corners[i][2]-j));
}
}
int res=INT_MIN;
//最大值
for(int i=0;i<8;++i){
res=max(res,max_dist[i]-min_dist[i]);
}
return res;
}
};