Giả sử chúng ta có một mảng không được sắp xếp. Chúng ta phải tìm ra sự khác biệt lớn nhất giữa các phần tử liên tiếp ở dạng đã sắp xếp của nó. Chúng ta sẽ trả về 0 nếu mảng chứa ít hơn 2 phần tử. Vì vậy, nếu mảng giống như [12,3,9,1,17], thì đầu ra sẽ là 6, vì mảng được sắp xếp sẽ là [1,3,9,12,17] vì vậy 5 sẽ là sự khác biệt lớn nhất như chênh lệch giữa 3 và 9 là 6.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
minVal:=inf, maxCal:=-inf
-
n:=kích thước của nums
-
nếu n <2, thì trả về 0;
-
cho tôi trong phạm vi từ 0 đến n - 1 -
-
minVal:=min of nums [i] and minVal
-
maxVal:=max of nums [i] và maxVal
-
-
gap:=celing of maxVal - minVal / n - 1
-
tạo một mảng có tên là bucketMax có kích thước n - 1 và điền vào mảng này bằng –inf
-
tạo một mảng có tên là bucketMin có kích thước n - 1 và điền vào mảng này với inf
-
cho tôi trong phạm vi từ 0 đến n - 1 -
-
x:=nums [i]
-
nếu x =minVal hoặc x =maxVal thì bỏ qua phần tiếp theo, chuyển sang lần lặp tiếp theo
-
idx:=(nums [i] - minVal) / khoảng trống.
-
bucketMax [idx]:=max của bucketMax [idx] và nums [i]
-
bucketMin [idx]:=min of bucketMin [idx] and nums [i]
-
-
ret:=0
-
trước:=minVal
-
cho tôi trong phạm vi từ 0 đến n - 1
-
nếu bucketMax [i] =-inf và bucketMin [i] =inf, thì bỏ qua phần tiếp theo, chuyển sang lần lặp tiếp theo
-
ret:=max của ret và bucketMin [i] - trước
-
trước:=bucketMax [i]
-
-
trả về tối đa ret, maxVal - trước
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
#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));
} Đầu vào
[12,3,9,1,17]
Đầu ra
6