কম্পিউটার টিউটোরিয়াল

সি++-এ রিভার্স পেয়ার


মান লিইয়ে নিই একটি অ্যারে রয়েছে, এই অ্যারেতে আমরা একটি পেয়ার (A[i] এবং A[j])-কে গুরুত্বপূর্ণ রিভার্স পেয়ার বলব যদি এটি নিম্নলিখিত শর্ত পূরণ করে:

  • যদি i < j এবং A[i] > 2* nums[j]

আমাদের গুরুত্বপূর্ণ রিভার্স পেয়ারের সংখ্যা বের করতে হবে। সুতরাং যদি ইনপুট হয় [2,8,7,7,2], তবে ফলাফল হবে ৩।

समाधान पद्धति

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे:

  • ans := 0
  • merge() ফাংশন সংজ্ঞায়িত করুন, যা একটি সরণি a, low, mid, high গ্রহণ করবে,
  • k := high - low + 1
  • আকার k-এর একটি temp সরণি সংজ্ঞায়িত করুন
  • i := low, j = mid + 1, k := 0
  • first := mid + 1
  • যতক্ষণ i <= mid, করুন:
    • যতক্ষণ first <= high এবং a[first] * 2 < a, করুন:
      • (first 1 বাড়ান)
    • যতক্ষণ (j <= high এবং a[j] <= a[i]), করুন:
      • temp[k] := a[j]
      • (j 1 বাড়ান)
      • (k 1 বাড়ান)
    • ans := ans + first - (mid + 1)
    • temp[k] := a[i]
    • (i 1 বাড়ান)
    • (k 1 বাড়ান)
  • যতক্ষণ j <= high, করুন:
    • temp[k] := a[j]
    • (k 1 বাড়ান)
    • (j 1 বাড়ান)
  • k := 0
  • i := low থেকে आरंभ করুন, जब i <= high, আপডেট করুন (i 1 বাড়ান), করুন:
    • a[i] := temp[k]
    • (k 1 বাড়ান)
  • calc() ফাংশন সংজ্ঞায়িত করুন, যা একটি সরণি a, low, high গ্রহণ করবে,
  • যদি low >= high, তবে:
    • ফেরত দিন
  • mid := low + (high - low)/2
  • calc(a, low, mid) ফাংশন কল করুন
  • calc(a, mid + 1, high) ফাংশন কল করুন
  • merge(a, low, mid, high) ফাংশন কল করুন
  • solve() ফাংশন সংজ্ঞায়িত করুন, যা একটি সরণি A গ্রহণ করবে,
  • ans := 0
  • n := A-এর আকার
  • calc(A, 0, n - 1) ফাংশন কল করুন
  • ans ফেরত দিন
  • মূল পদ্ধতিতে নিম্নলিখিত কাজ করুন:
    • ফেরত দিন solve(nums) ফাংশন কল করুন

उदाहरण

बेहतर समझ के लिए निम्नलिखিত कार्यान्वयन देखें:

#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-এ List reverse ফাংশন

  2. অ্যারে রিভার্স C++-তে

  3. C/C++-এ স্ট্রিং রিভার্স করা

  4. সি++-তে বিট রিভার্স