给你两个长度相等的整数数组,返回下面表达式的最大值:
|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
分析:
首先把绝对值符号去掉,展开表达式:
|arr1[i] - arr1[j]| + |arr2[i] - arr2[j]| + |i - j|
= (arr1[i] + arr2[i] + i) - (arr1[j] + arr2[j] + j)
= (arr1[i] + arr2[i] - i) - (arr1[j] + arr2[j] - j)
= (arr1[i] - arr2[i] + i) - (arr1[j] - arr2[j] + j)
= (arr1[i] - arr2[i] - i) - (arr1[j] - arr2[j] - j)
= -(arr1[i] + arr2[i] + i) + (arr1[j] + arr2[j] + j)
= -(arr1[i] + arr2[i] - i) + (arr1[j] + arr2[j] - j)
= -(arr1[i] - arr2[i] + i) + (arr1[j] - arr2[j] + j)
= -(arr1[i] - arr2[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
max( |arr1[i] - arr1[j]| + |arr2[i] - arr2[j]| + |i - j|)
= max(max(A) - min(A),
max(B) - min(B),
max(C) - min(C),
max(D) - min(D))
代码实现:
class Solution {
public:
int maxAbsValExpr(vector<int>& arr1, vector<int>& arr2) {
// |arr1[i] - arr1[j]| + |arr2[i] - arr2[j]| + |i - 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
max( |arr1[i] - arr1[j]| + |arr2[i] - arr2[j]| + |i - j|)
= max(max(A) - min(A),
max(B) - min(B),
max(C) - min(C),
max(D) - min(D))
*/
int max_a,min_a,max_b,min_b,max_c,min_c,max_d,min_d;
max_a=min_a=max_b=min_b=max_c=min_c=max_d=min_d=0;
for(int i=0; i<arr1.size(); i++){
int temp = arr1[i]+arr2[i]+i;
max_a = temp>max_a?temp:max_a;
min_a = temp<min_a?temp:min_a;
temp = arr1[i]+arr2[i]-i;
max_b = temp>max_b?temp:max_b;
min_b = temp<min_b?temp:min_b;
temp = arr1[i]-arr2[i]+i;
max_c = temp>max_c?temp:max_c;
min_c = temp<min_c?temp:min_c;
temp = arr1[i]-arr2[i]-i;
max_d = temp>max_d?temp:max_d;
min_d = temp<min_d?temp:min_d;
}
int max = max_a - min_a;
max = max_b-min_b>max?max_b-min_b:max;
max = max_c-min_c>max?max_c-min_c:max;
max = max_d-min_d>max?max_d-min_d:max;
return max;
}
};