一开始,我用两次循环来计算逆序数,编译器显示不通过:运行超时.
之后想到归并排序,时间复杂度为nlogn.
归并排序的思想是:将一个数组分为两个数组,....最终让每个数组只有一个元素,计算逆序数,并实行合并与排序.
代码实现:
public class Solution{
int count = 0;
public int InversePairs(int [] array) {
if(array != null && array.length != 0){
int[] tmpArr = new int[array.length];
mergeSort(array,0,array.length-1,tmpArr);
}
return count;
}
public void mergeSort(int[] array,int start,int end,int[] tmpAddr) {
if(start>=end) {
return;
}
int mid = (start+end)/2;
mergeSort(array, start, mid, tmpAddr);
mergeSort(array, mid+1, end, tmpAddr);
merge(array, start, mid, end, tmpAddr);
}
public void merge(int[] array ,int start,int mid,int end,int[] tmpAddr) {
int tmpIndex = start;
int start2 = mid+1;
int i = start;
while(start<=mid&&start2<=end) {
if(array[start] > array[start2]) {
tmpAddr[tmpIndex++] = array[start++];
count = (count + end - start2+1) % 1000000007;//逆序对
}else {
tmpAddr[tmpIndex++] = array[start2++];
}
}
if (start2 <= end) {
System.arraycopy(array, start2, tmpAddr, tmpIndex, end - start2 + 1);
}
if (start <= mid) {
System.arraycopy(array, start, tmpAddr, tmpIndex, mid - start + 1);
}
System.arraycopy(tmpAddr, i, array, i, end - i + 1);
}
}