剑指 Offer 51. 数组中的逆序对

题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。  困难 

方法:归并排序  时间复杂度O(nlogn)  空间复杂度O(n) 归并排序就是按照二分法将数组划分为若干个小数组,回溯的时候按照既定顺序两两合并,这样可以在合并的时候判断两数大小,确定逆序对的个数

 

 

def reversePairs(nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        def merge_sort(l,r):
            if l >= r:
                return 0
            
            mid = l + ((r - l) >> 1)
            res = merge_sort(l, mid) + merge_sort(mid + 1,r)
            tmp[l:r+1] = nums[l:r+1]
            i,j = l,mid + 1
            for k in range(l,r + 1):
                if i == mid + 1:
                    nums[j] = tmp[j]
                    j += 1
                elif j == r + 1 or tmp[i] <= tmp[j]:
                    nums[k] = tmp[i]
                    i += 1
                else:
                    nums[k] = tmp[j]
                    j += 1
                    res += mid - i + 1
            return res
        
        tmp = [0] * len(nums)
        return merge_sort(0,len(nums) - 1)

 

posted @ 2022-08-06 11:25  Liang-ml  阅读(22)  评论(0)    收藏  举报