劍指offer 面試51題


面試51題:

題目:數組中的逆序對

題目描述

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

 


免責聲明!

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



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