数组中的逆序对

题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入描述:
题目保证输入的数组中没有的相同的数字

数据范围:

对于%50的数据,size<=10^4

对于%75的数据,size<=10^5

对于%100的数据,size<=2*10^5

解题思路:
如果直接遍历数组,时间复杂度为o(n**2),思路太简单肯定是不行的。
所以可以使用归并排序,只用在合并数组的时候倒着合并就可以了。
比如对于数组a,b(已经是排序过了的)。两个指针分别指向两个子数组的末尾,并每次比较两个指针指向的数字。如果第一个数组的指针指向的值(x)大于第二个数组指针指向的值(y),那么说么对于第一个数组的x来说,第二个数组y及之前的数都是逆序,计算出个数即可。取出x放入临时数组,然后x的指针向前移动一位,继续比较。如果y比x大,那么对于y来说,第一个数组中在x和x之前的数都不可能与y逆序,所以取出y放入临时数组,y指针向前移动一位。
代码如下:

class Solution:
    def InversePairs(self, data):
        # write code here
        self.temp = [i for i in data]
        cum = self.mergesort(data,0, len(data) -1)
        print(data)
        return cum
    def mergesort(self,data,left,right):

        if left < right:
            mid = (left + right) //2
            cum1 = self.mergesort(data,left, mid)
            cum2 = self.mergesort(data,mid+1,right)
            cum3 = self.mergeAndCompute(data,left,mid,right)
            return cum1 + cum2 + cum3
        return 0

    def mergeAndCompute(self,data,left,mid,right):
        i,j,m,n = left,mid,mid+1,right
        x = right
        cum = 0
        while i <=j and  m <=n:
            if data[j] < data[n]:
                self.temp[x] = data[n]
                x-=1
                n-=1
            else:
                self.temp[x] = data[j]
                cum+= (n - m + 1)
                x-=1
                j-=1
        while i <=j:
            self.temp[x] = data[j]
            x-=1
            j-=1
        while m<=n:
            self.temp[x] = data[n]
            x-=1
            n-=1
        for i in range(left, right+1):
            data[i] = self.temp[i]
        return cum

注:这道题牛客网用python是存在bug的,运行始终超时,但是!!即使你直接返回一个实数,它依旧超时!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值