class Solution:
def reversePairs(self, nums: List[int]) -> int:
if not nums:
return 0
def mergesort(s,e):
if s==e: #递归终止条件:只剩下1个元素时,一定是有序的
return
m = s+(e-s)//2
mergesort(s,m)
mergesort(m+1,e)
left = nums[s:m+1][::-1] #逆序后,left【-1】是left[s],O(1)的pop操作得到最小的元素
right = nums[m+1:e+1][::-1]#逆序后,right【-1】是right[mid+1]
for i in range(s,e+1):
if not right or left and left[-1]<=right[-1]: #如果是<,则归并排序不是稳定的排序
#not right 或者 left 为True并且left[-1]<=right[-1]
nums[i] = left.pop()
else:
nums[i] = right.pop()
self.res +=len(left)
self.res = 0
mergesort(0,len(nums)-1)
return self.res
递归的过程是后调用的方法先执行
时间复杂度O(nlogn),空间复杂度n
参考链接
https://mp.weixin.qq.com/s?__biz=MzA5MDk1MjI5MA==&mid=2247484083&idx=1&sn=a8abc7c073db17db9eef2eab6646c16a&chksm=900285bea7750ca81e8a2585e7553efe697b777e2d4e803e66b5353026d26b1db76d2c2b2b0f&scene=178#rd
https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/solution/shu-zu-zhong-de-ni-xu-dui-by-leetcode-solution/