逆序数对的分治思想求解方法

2.1.4 CountInversions

         求一组数中的需要翻转的数的对数,其实就是求逆序对。

         该问题最直接的方法,也是我最开始在leetcode上求解此题时,采用了2个嵌套的for循环进行比较即可,时间复杂度为O(n2),本质上是对一组数进行了遍历,在遍历的同时到底做了比较还是交换位置,都不影响遍历的这个过程。既然是遍历,我们可以采用快速排序和合并排序都是对数遍历然后进行处理,而quickSort和MergeSort为什么会降低时间复杂度:我们发现合并排序之所以能降低时间复杂度,是因为当左边的第一个数a与右边的第一个数b比较后,若左边的数比右边的数小,那么直接将左边的数a进vector,那边左边的数a就再也不需要和不会与右边的其他数进行比较的机会,为什么没有这个比较的机会了,从表面上看数a进vector;从本质上看数右边的数是已Sorted的,所以数a若比右边的第一个数还小,那么自然比右边的其他数都小,这也是为什么可以放心大胆的将数a与右边第一个数比较后直接进vector的原因,这也是基于分治思想的合并排序能够大大的减少比较的次数,从而减低时间复杂度的本质原因。

          那么,求逆序对问题,其实就是将左边的数a与右边的数b进行比较,若左边的数比右边的数大,则构成一对逆序对,而左边的数是有序的,所以左边的数a后面的所有数自然比右边的数b大,那么在本次合并比较中,数a后面有多少数,就有多少逆序对。这样不需要将数a后面的数一一与数b进行比较就直接可以相减计算当前比较次数中有多少逆序对ÿ

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值