没有重复数字的全排列-js

题目描述

全排列,传入数字
输出所有可能出现的情况

思路分析

经典回溯法例题 采用闭包的方式记录总的结果(可以访问外部变量),记录每一层的结果,记录当前的深度,用记事本记录元素是否遍历过 递归退出条件

代码参考

const permute = (nums) => {
  // 所有的结果
  const res = []
  // 一次的数据 
  const path = []
  // 该位置的数字之前是否访问过,默认为0表示未访问过
  let use = new Array(nums.length).fill(0)
  // 遍历的深度
  let depth = 0
  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)
      dfs()
      use[i] = 0
      depth--
      path.pop()
    }
  }
  dfs()
  return res
}
posted @ 2023-01-18 21:21  含若飞  阅读(34)  评论(0编辑  收藏  举报