面試51題:
題目:數組中的逆序對
題目描述
在數組中的兩個數字,如果前面一個數字大於后面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個數組中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%1000000007
輸入描述:
題目保證輸入的數組中沒有的相同的數字
數據范圍:
對於%50的數據,size<=10^4
對於%75的數據,size<=10^5
對於%100的數據,size<=2*10^5
解題代碼:
# -*- 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