題目描述
在數組中的兩個數字,如果前面一個數字大於后面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個數組中的逆序對的總數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