মান লিইয়ে নিই একটি অ্যারে রয়েছে, এই অ্যারেতে আমরা একটি পেয়ার (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 বাড়ান)
- যতক্ষণ first <= high এবং a[first] * 2 < a, করুন:
- যতক্ষণ 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