class Solution {
public :
int reversePairs ( vector< int > & record) {
if ( record. size ( ) < 1 )
return 0 ;
int left, right;
left= 0 ;
right= record. size ( ) - 1 ;
int num= mergeSort ( left, right, record) ;
return num;
}
int mergeSort ( int left, int right, vector< int > & record) {
if ( left>= right)
return 0 ;
int mid;
mid= left+ ( right- left) / 2 ;
int leftnum= mergeSort ( left, mid, record) ;
int rightnum= mergeSort ( mid+ 1 , right, record) ;
int mergenum= merge ( left, right, mid, record) ;
return ( leftnum+ rightnum+ mergenum) ;
}
int merge ( int left, int right, int mid, vector< int > & record) {
int num= 0 ;
int i= left;
int j= mid+ 1 ;
vector< int > tmp;
while ( i<= mid && j<= right) {
if ( record[ i] > record[ j] ) {
num= mid- i+ 1 + num;
tmp. push_back ( record[ j++ ] ) ;
}
else
tmp. push_back ( record[ i++ ] ) ;
}
while ( i<= mid) {
tmp. push_back ( record[ i++ ] ) ;
}
while ( j<= right) {
tmp. push_back ( record[ j++ ] ) ;
}
for ( int i= 0 ; i< tmp. size ( ) ; i++ ) {
record[ left+ i] = tmp[ i] ;
}
return num;
}
} ;
class Solution {
public :
int reversePairs ( vector< int > & record) {
int num= 0 ;
for ( int step= 1 ; step< record. size ( ) ; step*= 2 ) {
int leftmin, leftmax, rightmin, rightmax;
for ( leftmin= 0 ; leftmin+ step< record. size ( ) ; leftmin= rightmax) {
leftmax= rightmin= leftmin+ step;
rightmax= leftmax+ step;
if ( rightmax> record. size ( ) )
rightmax= record. size ( ) ;
int start= leftmin;
vector< int > tmp;
while ( leftmin< leftmax && rightmin< rightmax) {
if ( record[ leftmin] <= record[ rightmin] ) {
tmp. push_back ( record[ leftmin++ ] ) ;
}
else {
tmp. push_back ( record[ rightmin++ ] ) ;
num = num+ leftmax- leftmin;
}
}
while ( leftmin< leftmax) {
tmp. push_back ( record[ leftmin++ ] ) ;
}
while ( rightmin< rightmax) {
tmp. push_back ( record[ rightmin++ ] ) ;
}
for ( int i= 0 ; i< tmp. size ( ) ; i++ ) {
record[ start+ i] = tmp[ i] ;
}
}
}
return num;
}
} ;