Leetcode-数组中的逆序对

背景

找数组中有多少对逆序的数列。

解题思路与题解

直接写归并排序的代码。归并排序的时间复杂度是 O ( n l o g n ) O(nlogn) O(nlogn), 然后在每次当右边小于左边时进行统计逆序对的数量(归并排序并不难写,但是这里如果考虑出现问题,可能会有很大的bug)。 其次,在写这道题时,使用归并排序,时间超时,当每次返回时,不返回数组,则时间不超时。核心为,在归并排序的基础上加:

self.res = self.res + (len(larr)-i) #统计逆序对的次数
超时代码
class Solution:
    def __init__(self):
        self.res = 0

    def reversePairs(self, nums):
        def reversePairsO(l,r):
            if l>r:
                return []
            if l == r:
                return [nums[l]]

            tres = []
            mid = (l+r)//2 
            larr = reversePairsO(l, mid)
            rarr = reversePairsO(mid+1, r)

            i=0
            j=0
            print("larr",larr)
            print("rarr",rarr)
            while i<len(larr) and j<len(rarr):
                if larr[i]<=rarr[j]:
                    tres.append(larr[i])
                    i += 1
                else:
                    self.res = self.res + (len(larr)-i)
                    tres.append(rarr[j])
                    j += 1

            while i<len(larr):
                tres.append(larr[i])
                i += 1

            while j<len(rarr):
                tres.append(rarr[j])
                j += 1
            return tres

        rres = reversePairsO(0,len(nums)-1)
        return self.res
# nums = [1,3,5,2,4,7]
# sol = Solution()
# sol.reversePairs(nums)
不超时代码
class Solution:
    def __init__(self):
        self.res = 0

    def reversePairs(self, nums):
        def reversePairsO(l,r):
            if l>r or l>=len(nums):
                return []
            if l == r:
                return [nums[l]]

            tres = []
            mid = (l+r)//2
#            mid = l + (r-l)//2
            reversePairsO(l, mid)
            reversePairsO(mid+1, r)
            i=l
            j=mid+1
            while i<=mid and j<=r:
                if nums[i]<=nums[j]:
                    tres.append(nums[i])
                    i += 1
                else:
                    self.res = self.res + (mid+1-i)
                    tres.append(nums[j])
                    j += 1

            while i<=mid:
                tres.append(nums[i])
                i += 1
                
            while j<=r:
                tres.append(nums[j])
                j += 1
            nums[l:r+1] = tres
        rres = reversePairsO(0,len(nums)-1)
        return self.res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值