मान लीजिए कि हमारे पास एक सरणी है, इस सरणी में हम एक जोड़ी (ए [i] और ए [जे]) को महत्वपूर्ण रिवर्स जोड़े के रूप में कहेंगे यदि यह निम्नलिखित शर्त को पूरा करता है -
- अगर मैं
2* अंक[j]
हमें महत्वपूर्ण प्रतिलोम युग्मों की संख्या ज्ञात करनी है। तो अगर इनपुट [2,8,7,7,2] जैसा है, तो परिणाम 3 होगा।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- उत्तर:=0
- एक फ़ंक्शन मर्ज () को परिभाषित करें, यह एक सरणी लेगा, निम्न, मध्य, उच्च,
- k :=उच्च - निम्न + 1
- के आकार की एक सरणी अस्थायी परिभाषित करें
- i :=कम, j =मध्य + 1, k :=0
- पहला :=मध्य + 1
- जबकि मैं <=बीच में, −
- . करें
- जबकि पहले <=उच्च और एक [पहले] * 2 <ए, करते हैं −
- (पहले 1 से बढ़ाएं)
- जबकि (j <=उच्च और a[j] <=a[i]), करते हैं −
- अस्थायी[k] :=a[j]
- (j को 1 से बढ़ाएं)
- (k 1 से बढ़ाएं)
- उत्तर:=उत्तर + प्रथम - (मध्य + 1)
- अस्थायी[k] :=a[i]
- (मैं 1 से बढ़ाएँ)
- (k 1 से बढ़ाएं)
- जबकि पहले <=उच्च और एक [पहले] * 2 <ए, करते हैं −
- जबकि j <=उच्च, करें −
- अस्थायी[k] :=a[j]
- (k 1 से बढ़ाएं)
- (j को 1 से बढ़ाएं)
- k :=0
- इनिशियलाइज़ करने के लिए i :=Low, जब i <=high, अपडेट करें (i को 1 से बढ़ाएँ), −
- करें
- a[i] :=temp[k]
- (k 1 से बढ़ाएं)
- एक फ़ंक्शन कैल्क () को परिभाषित करें, यह एक, निम्न, उच्च, एक सरणी लेगा,
- यदि निम्न>=उच्च, तो −
- वापसी
- मध्य :=निम्न + (उच्च-निम्न)/2
- फ़ंक्शन कैल्क (ए, लो, मिड) को कॉल करें
- फ़ंक्शन को कॉल करें कैल्क (ए, मिड + 1, हाई)
- फ़ंक्शन मर्ज को कॉल करें (ए, लो, मिड, हाई)
- एक फ़ंक्शन को हल करें परिभाषित करें (), यह एक सरणी A लेगा,
- उत्तर:=0
- n :=A का आकार
- फ़ंक्शन को कॉल करें कैल्क(ए, 0, एन -1)
- वापसी उत्तर
- मुख्य विधि से, निम्न कार्य करें
- रिटर्न कॉल फंक्शन सॉल्व (अंक)
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
public:
int ans = 0;
void merge(vector <int> &a, lli low, lli mid, lli high){
lli k = high - low + 1;
vector <lli> temp(k);
lli i = low, j = mid + 1;
k = 0;
lli first = mid + 1;
while(i <= mid){
while(first <= high && (lli)a[first] * 2 < (lli)a[i]) {
first++;
}
while(j <= high && a[j] <= a[i])
{
temp[k] = a[j];
j++;
k++;
}
ans += first - (mid + 1);
temp[k] = a[i];
i++;
k++;
}
while(j <= high){
temp[k] = a[j];
k++;
j++;
}
k = 0;
for(lli i = low; i <= high; i++){
a[i] = temp[k];
k++;
}
}
void calc(vector <int> &a, lli low, lli high){
if(low >= high)return;
lli mid = low + (high - low)/2;
calc(a, low, mid);
calc(a, mid + 1, high);
merge(a, low, mid, high);
}
lli solve(vector<int> &A) {
ans = 0;
lli n = A.size();
calc(A, 0, n - 1);
return ans;
}
int reversePairs(vector<int>& nums) {
return solve(nums);
}
};
main(){
Solution ob;
vector<int> v = {2,8,7,7,2};
cout << (ob.reversePairs(v));
} इनपुट
{2,8,7,7,2} आउटपुट
3