public class Solution {
public int InversePairs(int [] array) {
if(array.length==0){
return 0;
}
int[] copy = new int[array.length];
for(int i = 0;i < array.length; i++){
copy[i] = array[i];
}
int count=inversePairsMethod(array,copy,0,array.length-1);
return count ;
}
private static int inversePairsMethod(int[] array, int[] copy, int start, int end) {
if(start == end){
copy[start]=array[start];
return 0;
}
int len = (end - start)/2;
int left = inversePairsMethod(copy, array, start, start+len)% 1000000007;
int right = inversePairsMethod( copy,array, start + len +1, end)% 1000000007;
int i = start + len;
int j = end;
int index = end;
int count = 0;
while (i>=start && j >=start + len +1){
if(array[i] > array[j]){
copy[index--]=array[i--];
count += j - start - len;
if(count>=1000000007)//数值过大求余
{
count%=1000000007;
}
//count++;
}else {
copy[index--] = array[j--];
}
}
for(;i>=start;--i){
copy[index--] = array[i];
}
for(;j>=start + len + 1;--j){
copy[index--] = array[j];
}
return (count+left+right) % 1000000007;
}
}