给定一个不含重复数字的数组
nums,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
解法 dfs回溯
思路
先从数组第一个数开始放入,然后递归去放后面的数字,要记得恢复现场。结束条件就是数组当前长度与nums长度相等,说明所有数字都已经放完了。
同时也需要额外空间去保存之前是否使用过这个数字。
代码
function permute(nums: number[]): number[][] {
const result = [];
const used = new Array(nums.length).fill(false);
const dfs = (path) => {
if (path.length === nums.length) {
result.push([...path]);
return;
}
for (let i = 0; i < nums.length; i++) {
if (used[i]) continue;
used[i] = true;
path.push(nums[i]);
dfs(path);
path.pop();
used[i] = false;
}
}
dfs([]);
return result;
};
时空复杂度
时间复杂度:O(n * n!)
空间复杂度:O(n)