1.本题知识点
归并排序
2. 题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
3. 思路
① 归并排序,不会的请跳到我的基础算法博客查看。
② 归并过程中,排序的同时记录逆序对的个数。
Java版本:
public int SplitAndMerge(int [] array, int left, int right, int [] temp) {
if(array == null || array.length == 0 ) return 0;
if(left < right){
int mid = (left + right) >> 1;
int leftCount = SplitAndMerge(array, left, mid, temp)%1000000007;
int rightCount = SplitAndMerge(array, mid+1, right, temp)%1000000007;
int count = 0;
int i = left;
int j = mid +1;
int t = 0 ;
while(i <= mid && j <= right){
if(array[i] <= array[j]){
temp[t++] = array[i++];
}
else{
temp[t++] = array[j++];
count += mid - i +1 ;
if(count >= 1000000007){
count = count % 1000000007;
}
}
}
while(i <= mid){
temp[t++] = array[i++];
}
while(j <= right){
temp[t++] = array[j++];
}
t=0;
while(left <= right){
array[left++] = temp[t++];
}
return (leftCount + rightCount + count)%1000000007;
}
return 0;
}
public int InversePairs(int [] array) {
return SplitAndMerge(array, 0, array.length -1, new int[array.length]);
}