题目🌵
📝Leetcode 46 全排列
✏️leetcode-cn.com/problems/pe…
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例 1:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
解题思路💡
-
递归+回溯
-
回溯的本质就是穷举,我们这里可以抽象成一个n叉树
-
回溯需要终止条件
-
在当前题目中,当路径中的元素个数===数组元素个数,即为一组排列组合
if (path.length === k) { res.push([...path]) //当数组元素===原来数组的个数,说明一种排列组合完成 //递归终止 return } -
定义used数组,为了保证当前的排列中用的元素唯一
-
var permute = function (nums) {
const res = [],
path = []
const len = nums.length;
backtracking(nums, len, [])
return res
function backtracking(n, k, used) {
if (path.length === k) {
res.push([...path]) //当数组元素===原来数组的个数,说明一种排列组合完成
//递归终止
return
}
for (let i = 0; i < k; i++) {
if (used[i]) continue //遍历过的跳过
path.push(n[i]) //存入当前路径
used[i] = true //标记当前元素已经被使用
backtracking(n, k, used) // 递归下一层节点 dfs 深度遍历
path.pop() //撤销操作,将当前路径出栈一位,回溯
used[i] = false //撤销操作
}
}
}