最小相邻交换与逆序对

最小相邻交换与逆序对

给定一个排列 T T T,给定另外一个排列 T ′ T' T,其中两个排列中的元素相同,问只能交换相邻元素,最小的交换步骤是多少,使得两个排列的元素位置相同。

不同元素

如果两个排列元素不存在相同元素,那么我们可以给排列 T T T,重新标号为 1 , 2 , … , n 1,2,\ldots,n 1,2,,n的一个排列,变成一个映射,那么 T ′ T' T也对应着另外一个排列,那么最小的交换数为 T ′ T' T对应着另外一个排列的逆序对数。

证明:

我们可以通过 num \textit{num} num 包含的「逆序对」的数量来得到最少的交换次数。在每一次交换操作中,设我们交换的是 num [ i ] \textit{num}[i] num[i] num [ i + 1 ] \textit{num}[i+1] num[i+1]

  • 如果 num [ i ] < num [ i + 1 ] \textit{num}[i] < \textit{num}[i+1] num[i]<num[i+1],那么 num \textit{num} num 包含的逆序对数量会增加 1 1 1
  • 如果 num [ i ] > num [ i + 1 ] \textit{num}[i] > \textit{num}[i+1] num[i]>num[i+1],那么 num \textit{num} num包含的逆序对数量会减少 1 1 1

由于逆序对为 0 0 0的排列是唯一的,即自然排列,因此我们要做的就是将乱序变成自然排列,因此任何减少逆序对的操作都是必要且有意义的,无论两个要交换的元素中间隔了多少个元素

相同元素

若存在相同元素,按照排序的稳定性标列序号即可,因为相同元素排列不影响逆序对的形成,因此相同元素的相对位置不变,那么逆序对的数量就不会增加,因此按照稳定性标列序号,然后再求逆序对的方法是正确的。

例题

LeetCode 1850

先求第 k k k个排列,然后交换法求还是树状数组求逆序对均可。

P1966

不要被题面中两个序列均可交换所诱惑,因为任何对一个序列的操作都可以转换成对另外一个序列的等价操作,因此即对一个序列进行交换即可。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值