劍指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