정렬되지 않은 배열이 있다고 가정합니다. 정렬된 형식에서 연속 요소 간의 최대 차이를 찾아야 합니다. 배열에 2개 미만의 요소가 포함되어 있으면 0을 반환합니다. 따라서 배열이 [12,3,9,1,17]과 같으면 출력은 6이 됩니다. 정렬된 배열은 [1,3,9,12,17]이므로 5는 다음과 같이 최대 차이가 됩니다. 3과 9의 차이는 6입니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
minVal :=inf, maxCal :=-inf
-
n :=숫자 크기
-
n <2이면 0을 반환합니다.
-
0 ~ n – 1 −
범위의 i에 대해-
minVal :=nums[i] 및 minVal의 최소값
-
maxVal :=nums[i] 및 maxVal의 최대값
-
-
갭:=maxVal – minVal / n – 1의 셀링
-
n – 1 크기의 bucketMax라는 배열을 하나 만들고 –inf
로 채웁니다. -
n – 1 크기의 bucketMin이라는 배열 하나를 만들고 이를 inf
로 채웁니다. -
0 ~ n – 1 −
범위의 i에 대해-
x :=숫자[i]
-
x =minVal 또는 x =maxVal이면 다음 부분을 건너뛰고 다음 반복으로 이동합니다.
-
idx :=(nums[i] – minVal) / 간격.
-
bucketMax[idx] :=bucketMax[idx] 및 nums[i]의 최대값
-
bucketMin[idx] :=bucketMin[idx] 및 nums[i]의 최소값
-
-
렛 :=0
-
이전 :=minVal
-
0 ~ n – 1 범위의 i에 대해
-
bucketMax[i] =-inf 및 bucketMin[i] =inf이면 다음 부분을 건너뛰고 다음 반복으로 이동합니다.
-
ret :=ret 및 bucketMin[i]의 최대값 – 이전
-
이전 :=버킷맥스[i]
-
-
ret, maxVal의 최대값 반환 - 이전
예시
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
public:
int maximumGap(vector<int>& nums) {
lli minVal = INT_MAX;
lli maxVal = INT_MIN;
int n = nums.size();
if(n < 2) return 0;
for(int i = 0; i < n; i++){
minVal = min((lli)nums[i], minVal);
maxVal = max((lli)nums[i], maxVal);
}
int gap = ceil((double)(maxVal - minVal) / (double)(n - 1));
vector <int> bucketMax(n - 1, INT_MIN);
vector <int> bucketMin(n - 1, INT_MAX);
for(int i = 0; i < n; i++){
int x = nums[i];
if(x == minVal || x == maxVal) continue;
int idx = (nums[i] - minVal) / gap;
bucketMax[idx] = max(bucketMax[idx], nums[i]);
bucketMin[idx] = min(bucketMin[idx], nums[i]);
}
lli ret = 0;
lli prev = minVal;
for(int i = 0; i < n - 1; i++){
if(bucketMax[i] == INT_MIN && bucketMin[i] == INT_MAX) continue;
ret = max(ret, bucketMin[i] - prev);
prev = bucketMax[i];
}
return max(ret, maxVal - prev);
}
};
main(){
Solution ob;
vector<int> v = {12,3,9,1,17};
cout << (ob.maximumGap(v));
} 입력
[12,3,9,1,17]
출력
6