题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
样例:
输入:数组{7,5,6,4}
输出:存在5个逆序对,分别是{7,6},{7,5},{7,4},{6,4},{5,4},
解题思路
将数组分解成成两个长度为2的子数组,在把这两个子数组分别拆分为两个长度为1的子数组。接下来一边合并相邻的子数组,一边统计逆序对的数目。
这个过程,实际上就是归并排序的思路。
归并排序
时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn),空间复杂度 O ( n ) O(n) O(n),以时间换空间的做法。
class Solution:
def __init__(self):
self.count = 0
def mergeSort(self, data):
if len(data) < 2: return data
mid = len(data)//2
left = self.mergeSort(data[:mid])
right = self.mergeSort(data[mid:])
i, j = 0, 0
res = []
while i < len(left) and j < len(right):
if left[i] <= right[j]:
res.append(left[i])
i += 1
else:
res.append(right[j])
j += 1
self.count += (len(left)-i)
return res + left[i:] + right[j:]
def InversePairs(self, data):
# write code here
if len(data) < 2: return 0
self.mergeSort(data)
# 牛客网上要求输出要对1000000007取模
return self.count % 1000000007