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

你可能感兴趣的:(算法设计)