51、数组中的逆序对

思路:
利用归并排序的思想,先对前一半数组统计逆序对后从小到大排序,再对后一半数组统计逆序对后排序,再统计前后两个数组之间的逆序对。用空间换时间。


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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值