public long reversePairs(int[] A) {
if (A == null || A.length == 0) {
return 0L;
}
int[] tmp = new int[A.length];
return mergeSort(A, 0, A.length - 1, tmp);
}
private long mergeSort(int[] A, int start, int end, int[] tmp) {
if (start >= end) {
return 0L;
}
int sum = 0;
int mid = start + (end - start) / 2;
sum += mergeSort(A, start, mid, tmp);
sum += mergeSort(A, mid + 1, end, tmp);
sum += merge(A, start, mid, end, tmp);
return sum;
}
private long merge(int[] A, int start, int mid, int end, int[] tmp) {
for (int i = start; i <= end; i++) {
tmp[i] = A[i];
}
int sum = 0;
int left = start;
int right = mid + 1;
int cur = start;
while (left <= mid && right <= end) {
if (tmp[left] <= tmp[right]) {
A[cur++] = tmp[left++];
} else {
A[cur++] = tmp[right++];
sum += mid - left + 1;
}
}
while (left <= mid) {
A[cur++] = tmp[left++];
}
return sum;
}