题目
输入一个数组,求出这个数组中的逆序对的总数P,输出P%1000000007
逆序对
:在数组中的两个数字(可以不是相邻的2个数字),如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对
例:[1,2,3,4,0],有4个逆序对:(1,0)(2,0)(3,0)(4,0)
分治 递归
递归体:
-
如果这个数组中有0个或1个元素,一定没有逆序对,退递归返回0
-
如果数组中元素>1:
对数组
arr
,取arr[0]
作为划分的基准:
设置1个变量dst
记录本次递归统计的逆序对数量,初始为0;
设置2个数组big,small
,初始为空,分别用来存放比arr[0]
大和比arr[0]
小的元素;从
arr[1]
开始,遍历arr
:
. ①若当前元素>arr[0]
,将他放入big
中;此时没有产生逆序对
. ②若当前元素<arr[0]
,将他放入small
中;此时这个元素不仅和arr[0]
构成逆序对(比arr[0]
小),也和big
中所有元素构成逆序对(小于arr[0]
,一定小于big
中所有元素);令dst+=len(big)+1
-
对
big
和small
分别递归求逆序对数,结果和本次的dst
相加
代码
class Solution:
# 分治实现
def rr(self, arr):
if len(arr) < 2:
return 0
# 分成比arr[0]大的和比arr[0]小的两组
big, small = [], []
dst = 0
pre = arr[0]
for num in arr[1:]:
if num > pre:
big.append(num)
else:
small.append(num)
# big中的所有数和这个小的数都构成逆序对,并且arr[0]和他也构成逆序对
dst += len(big) + 1
# 递归统计分出来的2组中的逆序对
return dst + self.rr(big) + self.rr(small)
def InversePairs(self, data):
return self.rr(data)%1000000007