算法:全排列问题——n进位法

对于输出1 ~ n这些数组成的所有全排列的方法有最暴力的递归枚举法和相对简单写的递归交换法,但是有时我们只希望可以找到一个全排列的下一个全排列,就这样出现了n进位法。

例题

洛谷1706 全排列问题

题目描述
输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。

输入格式
一个整数n。

输出格式
由1~n组成的所有不重复的数字序列,每行一个序列。
每个数字保留 5个场宽。

输入样例

3

输出样例

    1    2    3
    1    3    2
    2    1    3
    2    3    1
    3    1    2
    3    2    1

全排列问题——n进位法

n进位法实现起来十分简单,就是每次不停地给排列加1(这里是(n + 1)进制的加法,既逢n进1),直到1 ~ n中的所有数字都只出现一次,没有重复出现。

举个例子,假设我们要求213的下一个排列

  • 213加一,变成214,这里是四进制,所以进位处理得到221,有重复数字,所以继续处理下去。
  • 221加一,变成222,这里是四进制,所以不用进位,但有重复数字,所以继续处理下去。
  • 222加一,变成223,这里是四进制,所以不用进位,但有重复数字,所以继续处理下去。
  • 223加一,变成224,这里是四进制,所以进位处理得到231,没有重复数字,符合要求,输出。

这里记得加个特判:如果说第0位不是0了,既a[0] > 0了,代表当前排列之后没有排列,返回false。

最后,算一下算法时间复杂度:根据排列组合求出总共有nn个不同排列,每个排列枚举时还要套一层n次的循环,所以解决此题的总时间复杂度是O(n^(n + 1))级别的。

代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值