题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入描述:
题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
示例1
输入
1,2,3,4,5,6,7,0
输出
7
Python解答
在归并排序的基础上进行修改(参考:常见的八种排序算法(动图理解 + Python代码实现))
# -*- coding:utf-8 -*-
class Solution:
def InversePairs(self, data):
# write code here
_, count = self.MergeSort(data)
return count
def MergeSort(self, data):
if len(data) < 2:
return data, 0
mid = int(len(data) / 2)
l, count_l = self.MergeSort(data[:mid])
r, count_r = self.MergeSort(data[mid:])
count = 0
mer = []
i = 0; j = 0
n = len(l)
while i < len(l) and j < len(r):
if l[i] <= r[j]:
mer.append(l[i])
i += 1
else:
mer.append(r[j])
j += 1
count += n - i # 合并时,出现前面的数组值l[i]大于后面数组值r[j]时;则前面数组l[i]~l[mid]都是大于r[j]的,count += mid - i
if count > 1000000007:
count %= 1000000007
if i < len(l):
mer += l[i:]
if j < len(r):
mer += r[j:]
return mer, (count_l + count_r + count) % 1000000007