Day 1 绝对值表达式的最大值

目录

题目链接

题目大意

输入

输出

思路

AC参考代码


题目链接

1131.绝对值表达式的最大值   来源:力扣(LeetCode)

题目大意

给你两个长度相等的整数数组,返回下面表达式的最大值:

|arr1[i] - arr1[j]| + |arr2[i] - arr2[j]| + |i - j|

其中下标 i,j 满足 0 <= i, j < arr1.length。

提示:

  • 2 <= arr1.length == arr2.length <= 40000
  • -10^6 <= arr1[i], arr2[i] <= 10^6

输入

示例 1:输入:arr1 = [1,2,3,4], arr2 = [-1,4,5,6]
             
示例 2:输入:arr1 = [1,-2,-5,0,10], arr2 = [0,-2,-1,-7,-4]           

输出

示例 1:输出:13

示例 2:输出:20

思路

对于本题,我最开始的想法就是利用双循环的暴力解法,但是根据提示中arr1和arr2的长度范围最大至40000,所以后台样例中大概有长度极大的数组。写了双循环方法尝试了一下发现果然如此。因此这种暴力解法只适合数组长度短的情况,对于长度极大的数组需要采用其他算法简化程序,减少复杂度。

综上,针对这个问题,尝试采用拆开绝对值符号的方法,然后发现算式可以不同情况下可以变成不同的八个式子:

arr1[i] - arr1[j] + arr2[i] - arr2[j] + i - j

arr1[i] - arr1[j] + arr2[i] - arr2[j] - i + j

arr1[i] - arr1[j] - arr2[i] + arr2[j] + i - j

arr1[i] - arr1[j] - arr2[i] + arr2[j] - i + j

-arr1[i] + arr1[j] + arr2[i] - arr2[j] + i - j

 -arr1[i] + arr1[j] + arr2[i] - arr2[j] - i + j

-arr1[i] + arr1[j] - arr2[i] + arr2[j] + i - j

-arr1[i] + arr1[j] - arr2[i] + arr2[j] - i + j

将i,j分开,将相同项分在一块,发现这八个式子可以化为类似这样的形式:

(arr1[i]+arr2[i]+i)-(arr1[j]+arr2[j]+j)  或  -(arr1[i]-0arr2[i]+i)-(arr1[j]+arr2[j]+j)

所以把式子分割化成几个小式子:

A:arr1[i]+arr2[i]+i

B:arr1[i]+arr2[i]-i

C:arr1[i]-arr2[i]+i

D:arr1[i]-arr2[i]-i

由此可得:

a=max(A)-min(A)

b=max(B)-min(B)

c=max(C)-min(C)

d=max(D)-min(D)

最终结果(此绝对值表达式的最大值)即:res=max(a,b,c,d)

AC参考代码

class Solution {
public:
    int maxAbsValExpr(vector<int>& arr1, vector<int>& arr2) {
        int len=arr1.size();

        int minA,minB,minC,minD,maxA,maxB,maxC,maxD;
        minA=INT_MAX,maxA=INT_MIN;
        minB=INT_MAX,maxB=INT_MIN;
        minC=INT_MAX,maxC=INT_MIN;
        minD=INT_MAX,maxD=INT_MIN;
        for(int i=0;i<len;i++){
            minA=min(minA,arr1[i]+arr2[i]+i);
            maxA=max(maxA,arr1[i]+arr2[i]+i);

            minB=min(minB,arr1[i]+arr2[i]-i);
            maxB=max(maxB,arr1[i]+arr2[i]-i);

            minC=min(minC,arr1[i]-arr2[i]+i);
            maxC=max(maxC,arr1[i]-arr2[i]+i);

            minD=min(minD,arr1[i]-arr2[i]-i);
            maxD=max(maxD,arr1[i]-arr2[i]-i);
        }
        return max(max(maxA-minA,maxB-minB),max(maxC-minC,maxD-minD));
    }
};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值