这题本人拍脑子想到了冒泡排序,每次交换元素的时候加上计数。但是这样的时间复杂度为
这题测试用例中有很长的数组的情况,不出意外超出限制时间了。
采用归并排序的方式,将问题拆分成为归并排序过程中 左边数组逆序树+右边数组逆序数+左右有序数组合并的逆序数。左右有序数组合并的逆序数计算,通过左右有序数组合并的过程中,合并数组插入右边数组元素时,加上左边数组还剩余的元素个数。
稍微修改一下归并排序的过程就可以实现
class Solution:
def merge_sort(self, arr, left, right):
if left >= right:
return 0
mid = (left + right) // 2
mergeCount = 0
leftCount = self.merge_sort(arr, left, mid)
rightCount = self.merge_sort(arr, mid + 1, right)
temp = []
index = 0
left_index = left
right_index = mid + 1
while (left_index <= mid or right_index <= right):
if ((right_index > right) or (left_index <= mid and arr[left_index] <= arr[right_index])):
temp.append(arr[left_index])
left_index += 1
else:
temp.append(arr[right_index])
mergeCount += mid - left_index + 1
right_index += 1
for i in range(right - left + 1):
arr[i+left] = temp[i]
# del temp
return leftCount + rightCount + mergeCount
def reversePairs(self, nums: List[int]) -> int:
return self.merge_sort(nums, 0, len(nums) - 1)