没有重复数字的全排列-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
}