归并排序中有一步是比较两个有序子数组中两个数的大小,当属于后半部分的那个数小于前半部分的那个数时,由于是有序子数组,那么前半部分那个数后面的数也大于后半部分的那个数,所以这些数都能组成逆序对。所以每次将这些逆序对个数累加即可。
public class Solution {
int cnt = 0;
int[] tmp;
int MOD = (int)(1e9 + 7);
public int InversePairs(int [] a) {
int n = a.length;
tmp = new int[n];
merge_sort(a,0,n-1);
return cnt;
}
public void merge_sort(int[] a,int l,int r) {
if(l >= r) {
return;
}
int mid = l + r >> 1;
merge_sort(a,l,mid);
merge_sort(a,mid+1,r);
int i = 0, j = l, k = mid + 1;
while(j <= mid && k <= r) {
if(a[j] <= a[k]) {
tmp[i++] = a[j++];
} else {
cnt = (cnt + mid - j + 1) % MOD;
tmp[i++] = a[k++];
}
}
while(j <= mid) {
tmp[i++] = a[j++];
}
while(k <= r) {
tmp[i++] = a[k++];
}
for(i = 0,j = l;j <= r;i++,j++) {
a[j] = tmp[i];
}
}
}