问题描述:
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以按任意顺序返回答案。
示例1:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
解题思路:回溯算法
- 定义一个目标数组res, 用来存储排列结果
- 定义回溯算法dfs, 参数有:path(当前路径),nums(输入数组),isVisited(该节点是否访问过,是一个布尔类型的数组)。
- 假设现在的路径是1 -> 2 -> 3, 当path的长度 === nums的长度时,说明当前已经到了叶子节点,将这条路径path加入到res中。这是函数出口。
- 然后遍历数组nums,判断当前元素是否被访问过,如果没有被访问,就将它加入到path中,并设置isVisited[i] = true
- 递归调用回调函数
- 到达叶子节点,需要回退
代码实现(js)
/**
* @param {number[]} nums
* @return {number[][]}
*/
var permute = function(nums) {
// 1.定义一个结果数组
let res = []
// 2.定义回溯算法
const dfs = (path, nums, isVisited) => {
// 出口
if(path.length === nums.length){
res.push(JSON.parse(JSON.stringify(path)))
return
}
for(let i = 0; i < nums.length; i++){
// 判断当前元素是否被访问过
if(!isVisited[i]){
// 将当前元素加入到路径中
path.push(JSON.parse(JSON.stringify(nums[i])))
isVisited[i] = true
dfs(path, nums, isVisited)
// 撤退
path.pop()
isVisited[i] = false
}
}
}
// 3.调用回溯算法
dfs([], nums, [])
return res
};