Data Structure
Networking
RDBMS
Operating System
Java
MS Excel
iOS
HTML
CSS
Android
Python
C Programming
C++
C#
MongoDB
MySQL
Javascript
PHP
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Reverse Pairs in C++
Suppose we have an array, in this array we will say one pair (A[i] and A[j]) as important reverse pairs if this satisfies the following condition −
- if i < j and A[i] > 2* nums[j]
We have to find the number of important reverse pairs. So if the input is like [2,8,7,7,2], then the result will be 3.
To solve this, we will follow these steps −
- ans := 0
- Define a function merge(), this will take an array a, low, mid, high,
- k := high - low + 1
- Define an array temp of size k
- i := low, j = mid + 1, k := 0
- first := mid + 1
- while i <= mid, do −
- while first <= high and a[first] * 2 < a, do −
- (increase first by 1)
- while (j <= high and a[j] <= a[i]), do −
- temp[k] := a[j]
- (increase j by 1)
- (increase k by 1)
- ans := ans + first - (mid + 1)
- temp[k] := a[i]
- (increase i by 1)
- (increase k by 1)
- while first <= high and a[first] * 2 < a, do −
- while j <= high, do −
- temp[k] := a[j]
- (increase k by 1)
- (increase j by 1)
- k := 0
- for initialize i := low, when i <= high, update (increase i by 1), do −
- a[i] := temp[k]
- (increase k by 1)
- Define a function calc(), this will take an array a, low, high,
- if low >= high, then −
- return
- mid := low + (high - low)/2
- call the function calc(a, low, mid)
- call the function calc(a, mid + 1, high)
- call the function merge(a, low, mid, high)
- Define a function solve(), this will take an array A,
- ans := 0
- n := size of A
- call the function calc(A, 0, n - 1)
- return ans
- From the main method, do the following
- return call the function solve(nums)
Let us see the following implementation to get better understanding −
Example
#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));
}
Input
{2,8,7,7,2}
Output
3
Advertisements