题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入描述:
题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
示例1
输
1,2,3,4,5,6,7,0
输出
7
思路:
类似于megersort
先统计子数组内部的逆序对的数目,然后再统计2个相邻子数组之间的逆序对的数目,在统计的过程中,还需要对数组排序,
排序可以避免重复统计。
1 public class Solution { 2 public int InversePairs(int [] a) { 3 int[] aux = new int[a.length]; 4 for(int i = 0;i<a.length;i++) 5 aux[i] = a[i]; 6 7 return fun(a,aux,0,a.length-1); 8 } 9 private int fun(int[] a,int[] aux,int lo,int hi){ 10 if(lo==hi) return 0; 11 int mid = (hi-lo)/2+lo; 12 int left = fun(a,aux,lo,mid)%1000000007; 13 int right = fun(a,aux,mid+1,hi)%1000000007; 14 15 int i = mid; 16 int j = hi; 17 int ai = hi;//aux_index 18 int count = 0; 19 while(i>=lo&&j>=mid+1){ 20 if(a[i]>a[j]){ 21 aux[ai--] = a[i--]; 22 count+=j-mid; 23 if(count>=1000000007)//数值过大求余 24 count%=1000000007; 25 } 26 else 27 aux[ai--]=a[j--]; 28 } 29 30 while(i>=lo) 31 aux[ai--]=a[i--]; 32 while(j>=mid+1) 33 aux[ai--] =a[j--]; 34 35 //更新数组 36 for(int k = lo;k<=hi;k++) 37 a[k] = aux[k]; 38 39 return (left+right+count)%1000000007; 40 } 41 }