길이가 같은 두 개의 정수 배열이 있다고 가정하고 최대값을 찾아야 합니다. |arr1[i] - arr1[j]| + |arr2[i] - arr2[j]| + |i - j|. 여기서 최대값은 모든 0 <=i, j
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
배열 v를 사용하는 getVal이라는 메서드를 정의합니다.
maxVal :=-inf, minVal :=inf
범위 0에서 v 크기까지의 i에 대해
minVal :=v[i] 및 minVal의 최소값
maxVal :=v[i] 및 maxVal의 최대값
반환 maxVal – minVal
기본 방법에서 다음을 수행하십시오.
크기 4의 배열 ret 만들기
n :=arr1의 크기
0 ~ n – 1 범위의 i에 대해
arr1[i] – arr2[i] + i를 ret[0]에 삽입
arr1[i] + arr2[i] + i를 ret[1]에 삽입
삽입 arr1[i] – arr2[i] - i를 ret[2]에 삽입
삽입 arr1[i] + arr2[i] - i를 ret[3]에 삽입
답변 :=-inf
0에서 3 사이의 i에 대해
ans :=ans 및 getVal(ret[i])
반환
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int getVal(vector <int>& v){
int maxVal = INT_MIN;
int minVal = INT_MAX;
for(int i = 0; i < v.size(); i++){
minVal = min(v[i], minVal);
maxVal = max(v[i], maxVal);
}
return maxVal - minVal;
}
int maxAbsValExpr(vector<int>& arr1, vector<int>& arr2) {
vector <int> ret[4];
int n = arr1.size();
for(int i = 0; i < n; i++){
ret[0].push_back(arr1[i] - arr2[i] + i);
ret[1].push_back(arr1[i] + arr2[i] + i);
ret[2].push_back(arr1[i] - arr2[i] - i);
ret[3].push_back(arr1[i] + arr2[i] - i);
}
int ans = INT_MIN;
for(int i = 0; i < 4; i++){
ans = max(ans, getVal(ret[i]));
}
return ans;
}
};
main(){
vector<int> v1 = {1,2,3,4}, v2 = {-1, 4, 5, 6};
Solution ob;
cout << (ob.maxAbsValExpr(v1, v2));
}
입력
[1,2,3,4]
[-1,4,5,6]
출력
13