全排列算法(DFS)

本文介绍了DFS(深度优先搜索)算法,将其比喻为二叉树的中序遍历,详细阐述了DFS的递归过程,并以全排列问题为例,解释了如何利用DFS解决排列组合问题,包括设置递归出口、避免重复选择的策略以及利用全局变量vis记录已使用数字。最后,通过示例代码展示了DFS在实现全排列时的逻辑流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、什么是DFS

DFS(Depth First Search),深度优先算法;这里笼统的概念就不去介绍了,其实dfs更像是我们对数据结构中学习的二叉树进行的中序遍历

 

对于以上一颗二叉树,如果用dfs的方式进行遍历的话,那应该是从根节点1开始,第二步如果选择走到2,下一步就是4,再下一步就是7,它 是一个不走到头不会回头的算法,走到了7之后,再回溯到4,4也没有其他子节点,再回溯到2,也没有其他子节点,再回溯到1,之后以相同的方式遍历右子树;

同样的,既然二叉树的遍历一般用的都是递归函数,那我们这里dfs同样采用递归的方式

二、全排列

首先,对于这个问题,我们会用到dfs,会用到递归,既然会用到递归那就要想到递归出口;如果一个递归函数没有出口,那程序崩溃是必然的。

如果选定一个合理的出口?

这个问题是一个排列问题,排列是指对一定量(比如n个)元素进行任意组合,那我们不妨用搜索深度 == n来当出口;

而且既然已经搜索了n次,说明存储答案的数组也已经满了,在退出之前可以对

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值