剑指 Offer 51. 数组中的逆序对
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,
求出这个数组中的逆序对的总数。
示例 1:
输入: [7,5,6,4]
输出: 5
限制:
0 <= 数组长度 <= 50000
解题思路:
代码实现:
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)