思路:
利用归并排序的思想,先对前一半数组统计逆序对后从小到大排序,再对后一半数组统计逆序对后排序,再统计前后两个数组之间的逆序对。用空间换时间。
import java.util.Arrays;
public class Solution {
public int InversePairs(int [] array) {
if((array==null) ||(array.length<=1)) return 0;
return f(array,0,array.length);
}
public int f(int[] array,int start,int end)
{
int sum = 0;
if((end-start)==1) return 0;
if(end>start){
sum =(f(array,start,((end-start)>>1)+start)%1000000007)+(f(array,((end-start)>>1)+start,end)%1000000007);
}
Arrays.sort(array,start,((end-start)>>1)+start);
Arrays.sort(array,((end-start)>>1)+start,end);
int p1 = start;
int p2 = ((end-start)>>1)+start;
int crease = 0;
while((p1!=((end-start)>>1)+start)&&(p2!=end))
{
if(array[p1]<=array[p2])
p1++;
else
{
crease = crease+((end-start)>>1)+start-p1;
p2++;
if(crease>=1000000007) crease%=1000000007;
}
}
sum = sum+crease;
return sum%1000000007;
}
}