題目描述
在數組中的兩個數字,如果前面一個數字大於后面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個數組中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%1000000007
輸入描述:
題目保證輸入的數組中沒有的相同的數字
數據范圍:
對於%50的數據,size<=10^4
對於%75的數據,size<=10^5
對於%100的數據,size<=2*10^5
示例1
輸出
復制7
# -*- coding:utf-8 -*-
class Solution:
def InversePairs(self, data):
# write code here
#用歸並排序,歸並拼接后用計算排序時元素的index變動了少
_,s=self.MergeSort(data)
return s%1000000007
def MergeSort(self,data):
n=len(data)
#遞歸基
if n==1:return data, 0
#分兩半來排序
part1,part2=data[:n//2],data[n//2:]
sorted_part1,s1=self.MergeSort(part1)
sorted_part2,s2=self.MergeSort(part2)
#排序后拼接這兩半,拼接后先計數,然后將兩個有序序列合並
s,sorted_temp=0,sorted_part1+sorted_part2
#用p、q兩個指針指向兩段,計算q中每個元素離插入點的index差
p,q,len1,len_all=0,sorted_temp.index(sorted_part2[0]),len(sorted_part1),len(sorted_temp)
while p<len1 and q<len_all:
#移動p使p成為插入排序的插入點,計算要移動多少個位置
while p<len1:
if sorted_temp[q]<sorted_temp[p]:
s+=len1-p
break
p+=1
q+=1
#完成排序,並把排序后的內容回溯給上一級做准備
l=[]
p,q=0,sorted_temp.index(sorted_part2[0])
while p<len1 and q<len_all:
if sorted_temp[p]<sorted_temp[q]:
l.append(sorted_temp[p])
p+=1
else:
l.append(sorted_temp[q])
q+=1
if p==len1:l+=sorted_temp[q:]
if q==len_all:l+=sorted_part1[p:]
return l,s+s1+s2
