1. 程式人生 > >劍指offer-陣列中的逆序對計算(python實現)

劍指offer-陣列中的逆序對計算(python實現)

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