使用归并排序,在递归合并的过程中,记录前数组与后数组的逆序对,不断累加即可。
public class Solution {
final int mod=1000000007;
int sum;
int b[];
public int InversePairs(int [] array) {
int l=array.length;
b=new int[l];
sum=0;
sort(array,0,l-1);
return sum;
}
void sort(int []a,int l,int r){
if(l>=r){
return;
}
int mid=(l+r)/2;
sort(a,l,mid);
sort(a,mid+1,r);
merge(a,b,l,mid,r);
}
void merge(int a[],int b[],int l,int mid,int r){
int i=l;
int j=mid+1;
int k=l;
while(i<=mid&&j<=r){
if(a[i]<=a[j]){
b[k++]=a[i++];
sum+=(j-(mid+1));
sum%=mod;
}
else{
b[k++]=a[j++];
}
}
while(i<=mid){
b[k++]=a[i++];
sum+=(r-mid);
sum%=mod;
}
while(j<=r){
b[k++]=a[j++];
}
for(i=l;i<=r;i++){
a[i]=b[i];
}
}
}