1131 绝对值表达式的最大值

题目描述:
给你两个长度相等的整数数组,返回下面表达式的最大值:
|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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值