- Reverse Pairs
For an array A, if i < j, and A [i] > A [j], called (A [i], A [j]) is a reverse pair.
return total of reverse pairs in A.
Example
Given A = [2, 4, 1, 3, 5] , (2, 1), (4, 1), (4, 3) are reverse pairs. return 3
使用归并排序:时间复杂度nlog n,归并基于分治,分为log n,治为n。
在合并的时候计算逆序对,由于左右两个子数组已经排序,所以会很方便。
public long reversePairs(int[] A) {
// write your code here
if(A == null || A.length == 0) return 0;
return mergeSort(A,0,A.length-1);
}
public long mergeSort(int[] A, int start, int end){
if(start >= end) return 0;
int sum = 0;
int mid = start + (end - start) / 2;
sum += mergeSort(A,start,mid);
sum += mergeSort(A,mid+1,end);
sum += merge(A,start,mid,mid+1,end);
return sum;
}
public long merge(int[] A, int start1, int end1, int start2, int end2){
int sum = 0;
int[] temp = new int[A.length];
int index1 = start1;
int index = start1;
while(start1 <= end1 && start2 <= end2){
if(A[start1] > A[start2]){
temp[index++] = A[start2++];
sum += end1 - start1 + 1;
}else{
temp[index++] = A[start1++];
}
}
while(start1 <= end1){
temp[index++] = A[start1++];
}
while(start2 <= end2){
temp[index++] = A[start2++];
}
for(int i = index1; i <= end2; i++){
A[i] = temp[i];
}
return sum;
}