0
点赞
收藏
分享

微信扫一扫

【LeetCode】46. 全排列 (JavaScript)

微笑沉默 2022-01-28 阅读 60

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例 1:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

示例 2:

输入:nums = [0,1]
输出:[[0,1],[1,0]]

示例 3:

输入:nums = [1]
输出:[[1]]

题解

  • 回溯法
  • 使用一个数组 mar 标记已经排列过的数
/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var permute = function(nums) {
    let res = []; // 结果集
    let mar = new Array(nums.length).fill(0); // 标记数组,判断是否已经参与排列
    // 回溯
    const dfs = function(n, arr) {
        if(n == nums.length) {
            res.push(arr.slice()); // 将排列完成的数组添加到结果集中(直接添加 arr 为浅拷贝)
            return;
        }
        for(let i = 0; i < nums.length; i++) {
            if(mar[i] == 1) continue; // 下标为 i 的数已经参与排列
            // 当前数未参与排列
            mar[i] = 1; // 标记
            arr.push(nums[i]); // 添加到当前排列的数组中
            dfs(n + 1, arr); // 递归,已排列数加一
            mar[i] = 0; // 取消标记
            arr.pop(); // 重置排列数组
        }
    }
    dfs(0, []);
    return res;
};
举报

相关推荐

0 条评论