算法:逆序对

逆序对

  • 什么是逆序对呢?百度百科这样解释:

设 A 为一个有 n 个数字的有序集 (n>1),其中所有数字各不相同。
如果存在正整数 i, j 使得 1 ≤ i < j ≤ n 而且 A[i] > A[j],则 这个有序对称为 A 的一个逆序对,也称作逆序数。

定义:

对于一个包含N个非负整数的数组A[1…n],如果有i < j,且A[ i ]>A[ j ],则称(A[ i] ,A[ j] )为数组A中的一个逆序对。
例如,数组(3,1,4,5,2)的逆序对有(3,1),(3,2),(4,2),(5,2),共4个。

下面我们来看一道题,选自第十二届蓝桥杯校内模拟赛第一期第五题:
算法:逆序对_第1张图片

思路:

根据题目我们了解到,(87 39 35 1 99 10 54 1 46 24 74 62 49 13 2 80 24 58 8 14 83 23 97 85 3 2 86 10 71 15)共有30个数,其中最大的数为99。

我们首先来定义一个一维数组:li = [0]*100全为0,规则是每遍历一遍逆序对,数组li相对应的索引值加一。若前面的数大于后面的数,即是一队逆序对的话,后面一个数(此数为1)在数组li中的位置在前一个数(此数为1)的前面,则从该数后一位数开始求数为1的和,这个和即是我们要求的逆序对个数。(这样讲可能不便于大家理解,大家可以看看下面的AC代码,便于理解)

# 逆序对
n = int(input())
mlist = list(map(int,input().split()))
li = [0]*100
res = 0
for i in range(n):
    li[mlist[i]] += 1
    res += sum(li[mlist[i]+1:])
print(res)

*至于li = [0]100为什么是100,其值要大于等于待求逆序对中的最大值。

此代码只用到了一层for循环,因此其时间复杂度比较小。
此题的重点在于理解什么的逆序对,以及如何处理逆序对,相信这题还有其他的很多解法,欢迎大家在评论区讨论关于逆序对的算法处理和解决思路。

算法:逆序对_第2张图片

你可能感兴趣的:(算法,蓝桥杯,Python,算法,python,数据结构)