Skip to content

46. 全排列 #58

Open
Open
@swiftwind0405

Description

@swiftwind0405

方法一:回溯法

解题思想:

  • 用递归模拟出所有情况
  • 遇到包含重复元素的情况,就回溯
  • 收集所有到达递归终点的情况,并返回

代码:

var permute = function (nums) {
    const res = [];
    const backtrack = (path) => {
        // 3. 递归的终点
        if(path.length === nums.length) {
            res.push(path);
            return;
        }
        // 遍历所有数字
        nums.forEach(n => {
            // 2. 如果包含当前数字,也就是重复了,即死路,就不要递归了
            if (path.includes(n)) return;
            // 1. 把数字加到数组里,进行递归调用
            backtrack(path.concat(n));
        })
    };
    backtrack([]);
    return res;
};

复杂度分析:

  • 时间复杂度:O(n!):每次递归里都有一个for循环,但是每次for循环都会减1,所以时间复杂度就是n的阶层;
  • 空间复杂度:O(n):递归的本质是堆栈,所以空间复杂度是递归的深度,而递归的深度就是输入数组的长度。

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions