मान लीजिए कि हमारे पास एक सरणी है, जिसे क्रमबद्ध नहीं किया गया है। हमें क्रमबद्ध रूप में क्रमिक तत्वों के बीच अधिकतम अंतर ज्ञात करना है। यदि सरणी में 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 की सीमा में -
-
minVal :=min of nums[i] and minVal
-
maxVal :=अधिकतम अंक[i] और maxVal
-
-
गैप:=मैक्सवेल की सीलिंग - मिनवैल / एन - 1
-
बकेटमैक्स नामक एक सरणी बनाएं जिसका आकार n-1 है, और इसे -inf से भरें
-
बकेटमिन नामक एक सरणी बनाएं जिसका आकार n-1 है, और इसे inf से भरें
-
मैं के लिए 0 से n - 1 की सीमा में -
-
एक्स:=अंक [i]
-
अगर x =minVal या x =maxVal, तो अगला भाग छोड़ें, अगले पुनरावृत्ति के लिए जाएं
-
idx :=(अंक [i] - minVal) / गैप।
-
बकेटमैक्स[idx] :=अधिकतम बकेटमैक्स[idx] और अंक[i]
-
बकेटमिन [idx] :=बकेटमिन का न्यूनतम [idx] और अंक [i]
-
-
रिट:=0
-
पिछला :=minVal
-
मेरे लिए 0 से n - 1 की सीमा में
-
अगर बकेटमैक्स [i] =-inf और बकेटमिन [i] =inf, तो अगला भाग छोड़ें, अगले पुनरावृत्ति के लिए जाएं
-
रिट :=अधिकतम रिट और बकेटमिन [i] - पिछला
-
पिछला :=बकेटमैक्स[i]
-
-
रिट का अधिकतम रिटर्न, मैक्सवैल - पिछला
उदाहरण
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
#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