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

73 阅读1分钟

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

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


示例 1:

输入: [7,5,6,4]
输出: 5

限制:
0 <= 数组长度 <= 50000

解题思路

www.bilibili.com/video/BV1CK…

代码实现

class Solution:
    def reversePairs(self, nums: List[int]) -> int:
        def mergeSort(L, R):
            if  L >= R: return 0
            m = L + (R-L)//2
            cnt = mergeSort(L, m) + mergeSort(m + 1, R)
            i, j = L, m + 1
            pos = L
            while i<= m and j <=R:
                if nums[i] <= nums[j]:
                    tmp[pos] = nums[i]
                    i += 1
                else:
                    tmp[pos] = nums[j]
                    j += 1
                    cnt += m-i+1
                pos += 1
            for k in range(i, m+1):
                tmp[pos] = nums[k]
                pos += 1
            for k in range(j, R+1):
                tmp[pos] = nums[k]
                pos += 1
            nums[L:R+1] = tmp[L: R+1]
            return cnt
        n = len(nums)
        tmp = [0]*n
        return mergeSort(0, n-1)