剑指offer-数组中的逆序对
题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数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
逆序对 ,使用归并排序
public int InversePairs(int [] array) { if(array==null||array.length<=0){ return 0; } return mergeSort(array,0,array.length-1)%1000000007; } private int mergeSort(int[] array,int left,int right){ if(left>=right){ return 0; } int mid = (left+right)/2; int leftc = mergeSort(array,left,mid); int rightc = mergeSort(array,mid+1,right); int count = merge(array,left,mid,right); return (leftc+rightc+count)%1000000007; } private int merge(int[] array,int left,int mid,int right){ int[] temp = new int[right-left+1]; int cl = mid; int cr = right; int cur = right-left; int count = 0; while(cl>=left&&cr>mid){ if(array[cl]<=array[cr]){ temp[cur] = array[cr]; cr--; } else{ temp[cur] = array[cl]; cl--; count += cr-mid; if(count>=1000000007){ count = count%1000000007; } } cur--; } while(cl>=left){ temp[cur--] = array[cl--]; } while(cr>mid){ temp[cur--] = array[cr--]; } for(int i=0;i<temp.length;i++){ array[left+i] = temp[i]; } return count; }