Skip to content

Latest commit

 

History

History
53 lines (46 loc) · 1.51 KB

35_回溯_47. 全排列 II .md

File metadata and controls

53 lines (46 loc) · 1.51 KB

-- 回溯 - mid 点击直达力扣

给定一个可包含重复数字的序列 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]]
// 排列问题:回溯
// 与上题的区别在于本题的nums有重复元素
// 解题思路:
//   1、在同一层树中不能有重复(树的宽度:nums的长度控制)
//   2、在同一支子树中可以有重复元素(树的深度:递归控制)
//   3、只需在上一题的基础上新增一个数组,用于存储同一层元素的使用情况即可。
let path = []
let result = []
function permuteUnique(nums: number[]): number[][] {
    result = []
    let used = new Array(nums.length)
    used.fill(false)
    backTracking(nums, used)
    return result
};

function backTracking(nums: number[], used: boolean[]): void {
    if (path.length === nums.length) {
        result.push([...path])
        return
    }
    // 新增一个数组,用于存储同一层元素的使用情况
    const unique = []
    for (let i = 0; i < nums.length; i++) {
        if (used[i] === true || unique.indexOf(nums[i]) != -1) { continue }
        unique.push(nums[i])
        used[i] = true
        path.push(nums[i])
        backTracking(nums, used)
        used[i] = false
        path.pop()
    }
}