Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

C++ में रिवर्स पेयर

मान लीजिए कि हमारे पास एक सरणी है, इस सरणी में हम एक जोड़ी (ए [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 से बढ़ाएं)
  • जबकि 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

  1. सी ++ एसटीएल में रिवर्स फ़ंक्शन सूचीबद्ध करें

    इस लेख में हम C++ में काम करने, वाक्य रचना और सूची ::रिवर्स () फ़ंक्शन के उदाहरणों पर चर्चा करेंगे। STL में सूची क्या है सूची एक डेटा संरचना है जो अनुक्रम में कहीं भी निरंतर समय सम्मिलन और विलोपन की अनुमति देती है। सूचियों को डबल लिंक्ड सूचियों के रूप में लागू किया जाता है। सूचियाँ गैर-सन्निहित स्म

  1. सी/सी++ में एक स्ट्रिंग को उलट दें

    सी भाषा में एक स्ट्रिंग को उलटने के लिए यहां एक उदाहरण दिया गया है, उदाहरण #include<stdio.h> #include<string.h> int main() {    char s[50], t;    int i = 0, j = 0;    printf("\nEnter the string to reverse :");    gets(s);    

  1. C++ में रिवर्स बिट्स

    मान लीजिए कि हमारे पास एक अहस्ताक्षरित संख्या x है, और हम आसानी से इसका द्विआधारी प्रतिनिधित्व (32 बिट अहस्ताक्षरित पूर्णांक) पा सकते हैं। हमारा काम बिट्स को उलटना है। तो अगर बाइनरी प्रतिनिधित्व 00000000000000000000001001110100 की तरह है, तो उलट बिट्स 00101110010000000000000000000000 होंगे। इसलिए हम