解题步骤
- 有很多分岔路
- 这些路里面有死路,也有出路
- 通常需要用递归来模拟所有的路
通过回溯的方式实现
- 时间复杂度:O (n!)
空间复杂度:O (n)
function permute(nums) {
const res = [];
const backtrack = (path) => {
if (path.length === nums.length) {
res.push(path);
return;
}
nums.forEach((n) => {
if (path.includes(n)) return;
backtrack(path.concat(n));
});
};
backtrack([]);
return res;
}
此处的时间复杂度会比较复杂,因为我们嵌套的过程中有个循环,而循环内又判断了如果包含 n 就不在递归,不能存在重复的元素。所以递归的次数是 n! 代表 n 的阶乘。n! = 123…( n-1)*n 。
由于我们输出的数组是一个临时的变量,所以不能作为空间复杂度的计算对象,代码中没有显示的使用线性增长的变量,但是存在一个递归,而递归的深度就是 n ,所以空间复杂度为 O (n) 。