在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。
这道题可以用归并排序做,算法复杂度o(nlogn)
public class Solution {
int cnt = 0; //记录逆序对个数
public int InversePairs(int [] array) {
if(array==null||array.length ==0) return 0;
MSort(array,0,array.length-1);
return cnt;
}
public void MSort(int[] array,int left,int right){
if(left==right) return;
else{
int m = (left+right)/2;
MSort(array,left,m);
MSort(array,m+1,right);
Merge(array,left,m,right);
}
}
public void Merge(int[] array,int left,int mid,int right){
int tmp[] = new int[right - left+1];
int i = left,j=mid+1,cur = 0;
while(i<=mid&&j<=right){
if(array[i]>array[j]){
cnt=(cnt + mid-i+1)%1000000007; //逆序对计算,注意取模
tmp[cur++] = array[j];
j++;
}else{
tmp[cur++] = array[i];
i++;
}
}
while(i<=mid){
tmp[cur++] = array[i++];
}
while(j<=right){
tmp[cur++] = array[j++];
}
cur = 0;
for(int k = left;k<=right;k++){
array[k] = tmp[cur++];
}
}
}