길이가 같은 두 개의 정수 배열이 있다고 가정하고 최대값을 찾아야 합니다. |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