全排列 II-LeetCode#47

给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

示例 1:

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

示例 2:

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

与#46不同的是,题目规定数组中可以有重复数字,那就需要在递归中规避

代码如下:

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var permuteUnique = function(nums) {
    nums = nums.sort(function(a, b) {
        return a - b;
    });
    let len = nums.length;
    let res = [];
    if (len == 0) {
        return [];
    }
    let path = [];
    let used = new Array().fill(false);
    dfs(nums, len, 0, path, used, res);
    return res;
}

function dfs(nums, len, depth, path, used, res) {
    if(depth >= len) {
        res.push([...path]);
        return;
    }
    for (let i = 0; i < len; i++) {
        if (used[i]) {
            continue;
        }
        if (i > 0 && nums[i] == nums[i-1] && !used[i-1]) {
            continue;
        }
        path.push(nums[i]);
        used[i] = true;
        dfs(nums, len, depth + 1, path, used, res);
        path.pop();
        used[i] = false;
    }
}

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注