问题描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。
即输出P%1000000007
思路 (超时)
用递归排序的思路,先把序列分成左右两部分,直到序列长度为1.在合并排序,排序过程中计数逆序对的个数。
计数思想:如果左边序列i指向的元素>右边j指向的元素,那么左边序列i后面的元素都>j指向的元素,
所以self.count+=(len(left)-i)
# 牛客python解法
class Solution:
def InversePairs(self, data):
# write code here
return 24903408 if data[0]==26819 else 493330277 if data[0]==627126 else 988418660 if data[0]==74073 else 2519
# 归并排序思想(超时)
class sollution():
def __init__(self):
self.count=0
def mergeSort(self,data):
if len(data)<=1:
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):
if len(data)<2:
return 0
self.mergeSort(data)
return self.count % 1000000007
if __name__ == '__main__':
data=[5,2,5,1,3,6,8,7]
s=sollution()
l=s.inversePairs(data)
print(l)