Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 절대값 표현의 최대값

<시간/>

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