劍指Offer(Python多種思路實現):數組中的逆序對

劍指Offer(Python多種思路實現):數組中的逆序對

面試51題:

題目:數組中的逆序對

題目描述

在數組中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個數組中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%1000000007

解題思路一:

    def InversePairs(self, data):
        if len(data) <= 0:
            return 0
        count = 0
        copy = []
        for i in range(len(data)):
            copy.append(data[i])
        copy.sort()
        i = 0
        while len(copy) > i:
            count += data.index(copy[i])
            data.remove(copy[i])
            i += 1
        return count%1000000007

解題思路二:

#暴力法
    def InversePairs2(self, data):
        if len(data)<=1:
            return 0
        count=0
        length=len(data)
        for i in range(length-1):
            for j in range(i+1,length):
                if data[i]>data[j]:
                    count+=1
        return count % 1000000007

解題思路三:

#歸併排序法
    def InversePairs3(self, data):
        if len(data)<=0:
            return 0
        length=len(data)
        copy=[0]*length
        for i in range(length):
            copy[i]=data[i]
        #copy數組爲原數組data的複製,在後面充當輔助數組
        count=self.Core(data,copy,0,length-1)
        return count % 1000000007
    
    def Core(self,data,copy,start,end):
        if start==end:
            copy[start]=data[start]
            return 0

        length=(end-start)//2 #length爲劃分後子數組的長度

        left=self.Core(copy,data,start,start+length)
        right=self.Core(copy,data,start+length+1,end)

        #初始化i爲前半段最後一個數字的下標
        i=start+length
        #初始化j爲後半段最後一個數字的下標
        j=end

        #indexCopy爲輔助數組的指針,初始化其指向最後一位
        indexCopy=end
        #準備開始計數
        count=0
        #對兩個數組進行對比取值的操作:
        while i>=start and j>=start+length+1:
            if data[i]>data[j]:
                copy[indexCopy]=data[i]
                indexCopy-=1
                i-=1
                count += j-start-length
            else:
                copy[indexCopy]=data[j]
                indexCopy-=1
                j-=1
        
        #剩下一個數組未取完的操作:
        while i>=start:
            copy[indexCopy]=data[i]
            indexCopy-=1
            i-=1
        while j>=start+length+1:
            copy[indexCopy]=data[j]
            indexCopy-=1
            j-=1
        
        return count+left+right

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章