剑指offer 数组中的逆序对 python

题目描述

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

样例

输入
1,2,3,4,5,6,7,0

输出
7

想法一:
第一眼肯定想到两重循环的方法,这个比较简单就不写了
那就说一种方法
就是先将列表从小到大排序,然后依次循环,每次都取到列表里最小的数,所以该数之前都是比它大的数字,所以累加每个索引即可(索引从0开始),每次加完之后要从原列表中pop该数.不过用python这样写会超时

class Solution1:
    def InversePairs(self, data):
        Sortdata = self.quick_sort(data)
        res = 0
        for i in Sortdata:
            res += data.index(i)
            data.pop(data.index(i))
        return res
	# 使用的快排
    def quick_sort(self, data):
        if len(data) < 2:
            return data
        left = self.quick_sort([i for i in data[1:] if i <= data[0]])
        right = self.quick_sort([j for j in data[1:] if j > data[0]])
        return left + [data[0]] + right

想法二:
第二个想法就是使用归并排序,先分再合,分的时候记录下交换的次数,合的时候,如果出现左边i 大于右边 j的时候,说明,左边i到mid的数都大于j,所以给逆序对数加上mid-i+1.

class Solution:
    def InversePairs(self, data):
        return self.sort(data[:], 0, len(data)-1, data[:]) % 1000000007

    def sort(self, temp, left, right, data):
        if right - left < 1:
            return 0
        if right - left == 1:
            if data[left] < data[right]:
                return 0
            else:
                temp[left], temp[right] = data[right], data[left]
                return 1
        mid = (left + right) // 2
        res = self.sort(data, left, mid, temp) + self.sort(data, mid+1, right, temp)
		# 合
        i = left
        j = mid + 1
        index = left

        while i <= mid and j <= right:
            if data[i] <= data[j]:
                temp[index] = data[i]
                i += 1
            else:
                temp[index] = data[j]
                res += mid - i + 1
                j += 1
            index += 1
        while i <= mid:
            temp[index] = data[i]
            i += 1
            index += 1
        while j <= right:
            temp[index] = data[j]
            j += 1
            index += 1
        return res

最后

刷过的LeetCode或剑指offer源码放在Github上了,希望喜欢或者觉得有用的朋友点个star或者follow。
有任何问题可以在下面评论或者通过私信或联系方式找我。
联系方式
QQ:791034063
Wechat:liuyuhang791034063
CSDN:https://blog.csdn.net/Sun_White_Boy
Github:https://github.com/liuyuhang791034063

你可能感兴趣的:(剑指offer)