逆序数

题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。

例: 在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6),(7,5),(7,4),(6,4),和(5,4)

答:一种O(n)的解法

思路如下:

  借助一个数组hash,统计array从后往前的情况下,到第i位时候,i后面每个数字出现的次数 

  1. 从后往前遍历array, hash数组记录数字array[i]已出现的次数   

  •   2. 对于数字array[i],统计 array[x](此处 x>i)的的部分,小于array[i]的数字总数 count,
  • count 等于hash数组中 hash[x]的和(此处 x < array[i])
  •   

  3. count即为 array 数组中, 以第i位开始的子数组的逆序数 

 

 

题目:

在一个排列中,如果任意一对元素前面的值比后面的值大,我们就说这个排列有一个逆序,一个排列中逆序的总数称为逆序数​。

例:DBBAC的逆序数为6 {DB、DB、DA、 DC 、BA、 BA}。

     实现一个函数,计算输入字符串(长度为1-1024)的逆序数,输入字符串只会出现ABCD这4个字符,大小关系为D>C>B>A,要求时间复杂度为O(n)。

 

posted @ 2017-04-04 12:25  临江仙zhe  阅读(127)  评论(0)    收藏  举报