力扣46题全排列

看到题目首先想到的就是这是一个枚举的方式,能通过很多个for循环完成,但是比较麻烦。

这题可以使用回溯算法,可以先画出一个决策树,例如:

这样就可以得出:每轮选择会在choices当中选一个没有使用的数,所以我们需要一个bool类型的数组来标记这个位置是否被使用,如果被使用了,就进入下一个位置。直到选到没有被使用的位置。

然后还需要一个一维数组来存放不同情况的值,以及一个全局变量的二维数组来存放所有的值。

这个数组中如果存放了没有被使用的数之后,然后bool类型的数组中这个位置就用true来表示已经被使用,就要进行对下一个位置的判断,这个判断还是需要从下标0来开始判断,通过这一方法进行剪枝。如果一维数组(123)放满了之后,即可将这个值传给二维数组,然后返回到上一层。就是由第三轮回到第二轮,然后再对最后一个加入的数进行删除,变为12,然后这个位置上的数(3)就说明没有被使用了。然后进入下一个位置choice[3],如果下一个位置超出范围就返回,回到第一层,再将一维数组的最后一个值删除,变为1,然后把这个值(2)所在位置的bool变为true表示这个数组中没有使用,然后对下一个位置choice[2]进行判断,即又进入第二轮选择13,然后对123进行判断那个值没有使用,然后进入第三层变为132。

其中的递归函数就是为了解决当前节点,它应该干什么事情。

回溯就是用来解决干掉一维数组的最后一个元素,以及更改bool数组的值。

剪枝就是用bool数组来判断每个位置上的数。

递归出口就是当一维数组满了就返回

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值