55.全排列

71 阅读1分钟

题目链接

给定一个不含重复数字的数组 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)