LINTCODE——逆序对
思路:本来直接统计的,结果TIMEOUT,后来改用归并排序统计,通过了,就一个注意的,数组num分成L,mid,R三段时,如果L<=i<=mid ,mid+1 <= j <=R,此刻如果num[j] < num[i] ,那么对于J来说就有mid+i-1个逆序对;
class Solution {
private :
long long count = 0;
vector<int> num;
public:
/*
* @param A: an array
* @return: total of reverse pairs
*/
long long reversePairs(vector<int> &A) {
// write your code here
int R = A.size() - 1, L = 0 ;
num.resize(R+1,0);
sort(A , L , R );
return count;
}
void sort(vector<int> &A , int L ,int R )
{
if(R <= L)
return;
int mid = (L+R)>>1;
sort(A,L,mid);
sort(A,mid+1,R);
merge(A,L,mid ,R);
}
void merge(vector<int> &A , int L ,int mid ,int R )
{
for(int x = L ; x <= R ; x++)
num[x] = A[x] ;
for(int k = L ,i = L ,j = mid+1; k <= R ; k++ )
{
if( i > mid)
A[k] = num[j++];
else if(j > R)
A[k] = num[i++];
else if(num[j] < num[i])
{
A[k] = num[j++];
count += (mid - i + 1);
}
else
A[k] = num[i++];
}
}
};