参考博客:https://blog.youkuaiyun.com/Hi_KER/article/details/81263889
康托展开解决的两个问题:
- 正康托展开:给出一个全排列的序列,求该序列是第几个全排列的序列。
如初始序列1234,那么3214是第15个全排列的序列
- 逆康托展开:给出数字k,求全排列序列中的第k个序列是什么。
如初始序列1234,第15个全排列的序列为3214
康托展开是为了解决全排列和序号之间的映射问题,对于全排列,可以通过next_permutation(a,a+n)(或者pre_permutation(a,a+n))去求解,当然也可以自己写一个递归回溯函数求解。
正康托展开
给定n=4,序列:3214,求该排列字典序?
第一位为3,则当第一位为1,2时生成的排列比目标排列小,有所以2*3!种;
第二位为2,当第二位为1是生成的排列更小,有1*2!种;
第三位为1,没有比1更小的排列方法,有0*1!种
第四位为4,由于1,2,3,在前面已经使用了,使用没有比4更小的了,有0*0!种
使用总共有2*3!+1*2!+0*1!+0*0!=14种排列方法比目标排