思路
回溯(Backtracking)
- 通过回溯的方式探索所有可能的排列
- path 数组用于保存当前的排列。每次我们将一个数字添加到 path 中,直到 path 长度等于 nums 长度,这时候就找到了一个排列,可以将其加入 result
used 数组
用于标记一个数字是否已经被使用过,避免重复使用
回溯过程:
- 递归地选择数组中的元素,尝试将其添加到 path 中
- 如果选择的元素没有被使用过,将其标记为已使用,然后递归进行下一步操作
- 如果 path 的长度等于 nums 的长度,说明找到了一个有效的排列,将其加入到结果数组 result 中
- 完成一次递归后,回溯,将当前元素从 path 中移除,并将其标记为未使用。
终止条件:
当 path 的长度等于 nums.length 时,收集结果,终止当前递归分支。
实现
var permute = function (nums) {
let result = [], path = [];
const backtracking = (nums, used) => {
if (path.length === nums.length) {
// 收集结果值
result.push([...path])
return;
}
for (let i = 0; i < nums.length; i++) {
if (!used[i]) {
// 可以使用当前值
path.push(nums[i])
used[i] = true;
} else {
continue;
}
backtracking(nums, used)
// 回溯
path.pop()
used[i] = false;
}
}
backtracking(nums, new Array(nums.length).fill(false))
return result;
};