剑指offer ---- 数组中的逆序对数目

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaohuigou1786/article/details/82590190

问题:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007

对于逆序对的问题,首先最容易想到的就是暴力穷举的方法。然而在题目中n的取值非常大,遍历的时间复杂度为O(n^2), 可见时间复杂度还是很高的,那么怎么才能解决这个问题呢?

我们可以根据改进一下归并排序的算法,先回忆一下归并排序的基本思想:我们把一个数组分成两部分,然后对这两部分递归的进行归并排序,然后对归并排序好的两部分进行归并,所以归并的时间复杂度为O(nlogn). 因为我们想统计数组中的逆序对数目,那么我们可以先将数组分成两部分,然后对两个数组递归统计逆序对的数目,然后统计出来两个数组间的逆序对数目(即左边数组中的数大于右边数组中的数的总对数)。根据以上分析我们的代码如下:

import math
class Solution:
    def InversePairs(self, data):
        # write code here
        count = 0
        if len(data)==1:
            return 0
        if len(data) == 2:
            if data[0]>data[1]:
                return 1
            else:
                return 0
        if len(data) > 2:
            mid = math.floor((len(data)-1)//2)
            data_l = data[:mid]
            data_r = data[mid:]
            data_sorted_l = sorted(data_l)
            data_sorted_r = sorted(data_r)
            for i in range(len(data_sorted_r)):
                for j in range(len(data_sorted_l)):
                    if data_sorted_l[j] > data_sorted_r[i]:
                        count += 1
        return (count + self.InversePairs(data_l)+self.InversePairs(data_r))%1000000007
if __name__ == '__main__':
    s = Solution()
    data1 = [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 (s.InversePairs(data1))

猜你喜欢

转载自blog.csdn.net/xiaohuigou1786/article/details/82590190