劍指offer-陣列中的逆序對計算(python實現)
阿新 • • 發佈:2019-01-24
劍指offer-陣列中的逆序對計算(牛客網題目,python實現)
問題描述
在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%1000000007 (來源-牛客網)
解題思路:
類似歸併排序
(1)遞迴拆分陣列,直至無法拆分
(2)按從小到大順序排序、歸併兩陣列,統計陣列內逆序對+陣列間逆序對
python3 實現
import math
class Solution:
def InversePairs(self, data):
if not data :
return False
if len(data)==1 :
return 0
def merge(tuple_before,tuple_after):
array_before = tuple_before[0]
cnt_before = tuple_before[1]
array_after = tuple_after[0]
cnt_after = tuple_after[1]
cnt = cnt_before+cnt_after
flag = len(array_after)-1
array_merge = []
for i in range(len(array_before)-1,-1,-1):
while array_before[i]<=array_after[flag] and flag>=0 :
array_merge.append(array_after[flag])
flag -= 1
if flag == -1 :
break
else:
array_merge.append(array_before[i])
cnt += (flag+1)
if flag == -1 :
for j in range(i,-1,-1):
array_merge.append(array_before[j])
else:
for j in range(flag ,-1,-1):
array_merge.append(array_after[j])
return array_merge[::-1],cnt
def mergesort(array):
if len(array)==1:
return (array,0)
cut = math.floor(len(array)/2)
tuple_before=mergesort(array[:cut])
tuple_after=mergesort(array[cut:])
return merge(tuple_before, tuple_after)
return mergesort(data)[1]%1000000007
#instance
S=Solution()
array1=[1,2,3,2,1]
print ('inverse pairs of array1:',S.InversePairs(array1))
array2=[5,4,3,2]
print ('inverse pairs of array2:',S.InversePairs(array2))
array3=[5,4,1,3,2]
print ('inverse pairs of array3:',S.InversePairs(array3))
array4=[364,637,341,406,747,995,234,971,571,219,993,407,416,366,315,301,601,650,418,355,460,505,360,965,516,648,727,667,465,849,455,181,486,149,588,233,144,174,557,67,746,550,474,162,268,142,463,221,882,576,604,739,288,569,256,936,275,401,497,82,935,983,583,523,697,478,147,795,380,973,958,115,773,870,259,655,446,863,735,784,3,671,433,630,425,930,64,266,235,187,284,665,874,80,45,848,38,811,267,575]
print ('inverse pairs of array4:',S.InversePairs(array4))
執行結果:
inverse pairs of array1: 4
inverse pairs of array2: 6
inverse pairs of array3: 8
inverse pairs of array4: 2519