數組中的逆序對(python)


題目描述

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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM