递归:全排列问题

本文探讨了如何使用递归方法解决全排列问题。通过分解问题,以字典序从小到大顺序输出所有可能的排列组合。对于输入的n个整数,递归算法会跟踪已使用数字,并在回溯过程中更新排列状态。文章提供了具体的代码实现来阐述这一思想。
摘要由CSDN通过智能技术生成

全排列问题

给出1~n,n个整数,把这n个整数按照这种顺序输出n个数的所有排列:

  • 按照字典序从小到大顺序输出,如果说(a1,a2,……an)的字典序小于(b1,b2,……bn),指的是存在一个i,使得a1=b1,a2=b2,……a(i-1)=b(i-1),ai<bi
  • 例如:1,2,3三个数按顺序输出全排列就是(1,2,3)、(1,3,2)、(2,1,3)、(2,3,1)、(3,1,2)、(3,2,1)

解析

以输入的是1,2,3为例,这个问题可以分解成这样的几个小问题:
在这里插入图片描述
拿出其中一个问题,以1开头的三位全排列内部可以分成三个小问题,这三个小问题其实就是在1为开头的基础上,判断第二位后面的各个位
因为1已经在第一位出现过了,所以就不会出现在第二位,那么第二位只有两小小个问题
在这里插入图片描述
如此递推下去,这就是这道题的解决思想

那么我们可以设置一个boolean类型的HashTable,用来记录到目前为止,前几位哪些数字已经使用了,已经使用的记为true
设置一个index,指示当前是第几位
假设我们在第一位为2,第二位为1的基础上到了第三位,第三位只能是三3,到了这一步,这一种情况已经走到底了,hashTable都为true
在这里插入图片描述
之后返回到第二位,第一位的2我们不能动,第二位还可以是3,但是由于刚才我们在第三位用到了3hashTable[3]已经是true了,第二位无法变成3,这就说明,我们在返回到上这一位之后,要把子问题中变成true的变回false

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值