题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数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 class Solution {
public int InversePairs(int [] array) {
if(array==null || array.length<2)
return 0;
return mergeSort(array,0,array.length-1);
}
public int mergeSort(int[] array,int left,int right){
if(left>=right) return 0;
int mid = left + ((right-left)>>1);
return (mergeSort(array,left,mid)%1000000007 + mergeSort(array,mid+1,right)%1000000007 + merge(array,left,mid,right))%1000000007;
}
public int merge(int[] array,int left,int mid,int right){
int count = 0;
int p1 = left;
int p2 = mid + 1;
int[] temp = new int[right-left+1];
int idx = 0;
while(p1<=mid&&p2<=right){
if(array[p1]<=array[p2]){
temp[idx++] = array[p1++];
}
else{
count += mid - p1 + 1;
count %= 1000000007;
temp[idx++] = array[p2++];
}
}
while(p1<=mid){
temp[idx++] = array[p1++];
}
while(p2<=right){
temp[idx++] = array[p2++];
}
idx = 0;
for(int i=left;i<=right;i++){
array[i] = temp[idx++];
}
return count;
}
}