nums라고 하는 하나의 정수 배열이 있다고 가정합니다. 이 배열의 값은 |nums[i]-nums[i+1]|의 합으로 정의됩니다. 범위 0에서 n - 1에 있는 모든 i에 대해. 여기서 n은 배열의 크기입니다. 주어진 배열의 하위 배열을 선택하고 반전할 수 있습니다. 이 작업은 한 번만 수행할 수 있습니다. 그런 다음 최종 배열의 가능한 최대값을 찾아야 합니다.
따라서 입력이 [1,5,4,2,3]과 같으면 출력은 10이 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
ret :=0, 추가 :=0
-
n :=숫자 크기
-
minVal :=inf, maxVal :=-inf
-
initialize i :=0의 경우, i
-
a :=숫자[i], b :=숫자[i + 1]
-
렛 :=렛 + |b - a|
-
extra :=extra 및 |(nums[0] - b) - |a - b||
의 최대값 -
extra :=extra의 최대값 및 |(nums[n - 1] - a) - |a - b||
-
maxVal :=maxVal의 최대값과 b와 b의 최소값
-
minVal :=minVal의 최소값 및 최대값 및 b
-
-
ret + 추가의 최대값 및 (maxVal - minVal) * 2를 반환
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#include <bits/stdc++.h> using namespace std; class Solution { public: int maxValueAfterReverse(vector<int>& nums) { int ret = 0; int extra = 0; int n = nums.size(); int minVal = INT_MAX; int maxVal = INT_MIN; for(int i = 0; i < n - 1; i++){ int a = nums[i]; int b = nums[i + 1]; ret += abs(b - a); extra = max(extra, abs(nums[0] - b) - abs(a - b)); extra = max(extra, abs(nums[n - 1] - a) - abs(a - b)); maxVal = max(maxVal, min(a, b)); minVal = min(minVal, max(a, b)); } return ret + max(extra, (maxVal - minVal) * 2); } }; main(){ Solution ob; vector<int> v = {1,5,4,2,3}; cout << (ob.maxValueAfterReverse(v)); }
입력
{1,5,4,2,3}
출력
10