剑指offer-数组中的逆序对计算(python实现)

19 篇文章 0 订阅
15 篇文章 0 订阅

剑指offer-数组中的逆序对计算(牛客网题目,python实现)

问题描述

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

解题思路:

类似归并排序

(1)递归拆分数组,直至无法拆分
(2)按从小到大顺序排序、归并两数组,统计数组内逆序对+数组间逆序对

具体参考 牛客网top1回答:
https://www.nowcoder.com/questionTerminal/96bd6684e04a44eb80e6a68efc0ec6c5

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值