自学内容网 自学内容网

数据结构与算法之递归: LeetCode 47. 全排列 II (Ts版)

全排列 II

描述

  • 给定一个可包含重复数字的序列 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]]

提示

  • 1 <= nums.length <= 8
  • -10 <= nums[i] <= 10

Typescript 版算法实现


1 ) 方案1:搜索回溯

function permuteUnique(nums: number[]): number[][] {
    // 数字有重复,排列不能重复
    nums.sort((a, b) => b - a)
    let ret = []
    let path = []
    const backtrack = (used) => {
        if (path.length === nums.length) {
            ret.push([...path])
            return
        }
        for (let i = 0; i < nums.length; i++) {
            let num = nums[i]
            if (nums[i] === nums[i - 1] && !used[i - 1]) {
                continue
            }
            if (!used[i]) {
                used[i] = true
                path.push(num)
                backtrack(used)
                path.pop()
                used[i] = false
            }

        }
    }
    backtrack([])
    return ret
};

2 ) 方案2:搜索回溯-优化版

function permuteUnique(nums: number[]): number[][] {
    const ans = [];
    const vis = new Array(nums.length).fill(false);
    const backtrack = (idx, perm) => {
        if (idx === nums.length) {
            ans.push(perm.slice());
            return;
        }
        for (let i = 0; i < nums.length; ++i) {
            if (vis[i] || (i > 0 && nums[i] === nums[i - 1] && !vis[i - 1])) {
                continue;
            }
            perm.push(nums[i]);
            vis[i] = true;
            backtrack(idx + 1, perm);
            vis[i] = false;
            perm.pop();
        }
    }
    nums.sort((x, y) => x - y);
    backtrack(0, []);
    return ans;
};

原文地址:https://blog.csdn.net/Tyro_java/article/details/145233874

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!