首页 > 其他分享 >全排列(递归)

全排列(递归)

时间:2022-12-15 11:13:43浏览次数:60  
标签:use 排列 递归 nums depth 遍历 path

排列:

从n个数中选取m(m<=n)个数按照一定的顺序进行排成一个列,叫作从n个元素中取m个元素的一个排列。不同的顺序是一个不同的排列。从n个元素中取m个元素的所有排列的个数,称为排列数。

全排列:

从n个元素取出n个元素的一个排列,称为一个全排列。全排列的排列数公式为

时间复杂度:

n个数的全排列有n!种,每一个排列都有n个数据,所以输出的时间复杂度为O(n*n!),呈指数级,无法处理大型数据。

题目要求

输入:_permute('abc')

输出:['abc','acb','bac','bca','cab','cba']

思路分析

全排列的解决方法有很多种,递归,回溯,暴力等。我这里使用的是回溯法。
所谓回溯法,就是在程序执行结束之后又返回到之前遍历的地方继续下一次遍历
image
参考B站up主:李二柱子是只喵
需要注意一次遍历到底侯需要回溯

代码示例

const permute = (nums) => {
  // 一次的数据 
  const path = []
  // 所有的结果
  const res = []
  // 该位置的数字之前是否访问过,默认为0表示未访问过
  let use = new Array(nums.length).fill(0)
  // 遍历的深度
  let depth = 0

  // dfs(nums, depth, use, path, res)
  const dfs = () => {
    // 递归退出条件,如果深度等于数组长度,则说明已经遍历到树的叶子节点
    if (depth === nums.length) {
      res.push([...path])
      return
    }
    // 遍历数组
    for (let i = 0; i < nums.length; i++) {
      // 判断当前元素是否使用过,如果用过则跳出
      if (use[i]) {
        continue
      }
      path.push(nums[i])
      depth++
      use[i] = 1
      dfs(nums, depth, use, path, res)
      use[i] = 0
      depth--
      path.pop()
    }
  }
  dfs()
  return res

}
console.log(permute([1, 2, 3, 4]))

标签:use,排列,递归,nums,depth,遍历,path
From: https://www.cnblogs.com/zx529/p/16984508.html

相关文章

  • LeetCode HOT 100:全排列
    题目:46.全排列题目描述:给你一个没有重复元素的数组,返回其所有可能的全排列。全排列是什么呢?举个简单的例子,数组[1,2,3],其中一个排列为[2,1,3],该数组所有的全排列为[......
  • [IOI2019]排列鞋子
    $[IOI2019]$排列鞋子链接:https://www.luogu.com.cn/problem/P5749题目描述:将一个序列$A$交换到满足对于任意的$i(1<=i<=n/2)$满足$a_{i}=-a_{i\times2}$且$a_{i}<......
  • [ZJOI2010]排列计数
    $[ZJOI2010]$排列计数链接:https://www.luogu.com.cn/problem/P2606题面:求满足$p_{i}>p_{i/2}(∀i∈[2,n])$的排列个数。题解:考虑将限制转化成一棵树,如果我们将$i......
  • JS使用递归将原始数据转换为树形结构数据
    因为数据库中存放的数据终究全是扁平化的,因此获取后要手动将其改成树形结构,方便el-tree进行渲染。假设数据如下(至少是要有节点ID和父节点ID)   最终要达到如下效果(e......
  • golang递归获取目录下的所有文件
    简言1.golang为我们提供了完善的文件操作库,例如os,ioutil等2.前人已经写了文件操作的示例,具体可参考这篇博客 ​​https://colobu.com/2016/10/12/go-file-operations/#mo......
  • java springboot项目树结构递归查询
    记录工作本文记录树结构递归查询,像菜单栏和部门首先需要一张表CREATETABLE`sys_dict`(`id`intNOTNULLAUTO_INCREMENT,`parent_id`intNOTNULL,`name`......
  • 递归树求取递归的时间复杂度
    ......
  • 力扣-31-下一个排列
    很明显,对于一个排列而言,最后一个位置是动不了的那么就从倒数第二个位置开始用递归一点点分析错了几次之后终于自己写出来了(叉腰骄傲)voidnextPermutation(vector<int>&......
  • 剑指offer84:包含重复元素集合的全排列
    题目:给定一个可包含重复数字的整数集合nums,按任意顺序返回它所有不重复的全排列。1.输入:nums=[1,1,2]输出:[[1,1,2],[1,2,1],[2,1,1]]2.输入:nums=[1,2,3]输出......
  • Java实现二叉树的先序、中序、后序、层序遍历(递归+非递归方法),附带自己深入浅出的讲解
     二叉树(Binarytree)是树形结构的一个重要类型,也一种非常重要的数据结构,更是算法题中高频出现的知识点,不管是为了应付工作还是面试,都有必要深度学习一下。二叉树有多种遍......