在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。给你一个数组,求出这个数组中逆序对的总数。
概括:如果a[i] > a[j] 且 i < j, a[i] 和 a[j] 构成一个逆序对。
样例
序列 [2, 4, 1, 3, 5] 中,有 3 个逆序对 (2, 1), (4, 1), (4, 3),则返回 3 。
一刷ac
解题思路:将统计逆序对的过程分为两个部分,第一讲数组分两组排序,第二将两组排序好的部分对比统计逆序对。
public class Solution {
/**
* @param A an array
* @return total of reverse pairs
*/
public long reversePairs(int[] A) {
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 mid = (start + end) / 2;
long res = 0;
res += mergeSort(A, start, mid);
res += mergeSort(A, mid+1, end);
res += merge(A, start, mid, end);
return res;
}
public long merge(int[] A, int start, int mid, int end){
if(start >= end) return 0;
int left = start;
int right = mid+1;
int[] tmp = new int[A.length];
long res = 0;
int index = start;
while(left <= mid && right <= end){
if(A[left] > A[right]){
res += mid-left+1;
tmp[index++] = A[right++];
}else{
tmp[index++] = A[left++];
}
}
while(left <= mid){
tmp[index++] = A[left++];
}
while(right <= end){
tmp[index++] = A[right++];
}
for(int i = start; i <= end; i++){
A[i] = tmp[i];
}
return res;
}
}