目录
题目链接
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));
}
};