劍指offer第二版(Python3)--面試題51 : 數組中的逆序對

第2章 面試需要的基礎知識

第3章 高質量的代碼

第4章 解決面試題的思路

第5章 優化時間和空間效率

  面試題39 : 數組中出現次數超過一半的數字

  面試題40 : 最小的k個數

  面試題42 : 連續子數組的最大和

  面試題43 : 從1到n整數中1出現的次數

  面試題45 : 把數組排成最小的數

  面試題49 : 醜數

  面試題50 : 第一個只出現一次的字符

  面試題51 : 數組中的逆序對

第6章 面試中的各項能力

第7章 兩個面試案例


題目描述
  在數組中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個數組中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%1000000007

解題思路
  歸併排序法,但無法AC。

實戰

class Solution:
    def InversePairs(self, data):
        # write code here
        if not data:
            return None

        def inversePairsCore(array, counts):
            # nonlocal counts
            if len(array) == 1:
                return array, counts
            mid = len(array) // 2
            left, counts = inversePairsCore(array[:mid], counts)
            right, counts = inversePairsCore(array[mid:], counts)
            
            p1 = 0
            p2 = 0
            result = []
            while p1 < len(left) and p2 < len(right):
                if left[p1] > right[p2]:
                    counts += len(left) - p1
                    result.append(right[p2])
                    p2 += 1
                else:
                    result.append(left[p1])
                    p1 += 1
            result += left[p1:] + right[p2:]
            return result, counts
        
        _, counts = inversePairsCore(data, 0)
        
        return counts%1000000007
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章