【Leetcode】47. 全排列 II

46 阅读1分钟

leetcode.png

这一题是结合了46题(全排列)以及40题(去重)

13行的这个continue没什么好说的,剪掉自己
这里的重点就是在16行,前面的一个元素没有被使用过,且当前的元素也没有被使用过,且两个元素相同,那么就可

var permuteUnique = function (nums) {
    let res = []
    nums.sort((a, b) => a - b)
    // 标记当前元素是否使用过
    let used = new Array(nums.length).fill(false)
    var backtrack = function (one) {
        if (one.length === nums.length) {
            res.push([...one])
            return
        }
        for (let i = 0; i < nums.length; ++i) {
            // 当前元素使用过,则跳过
            if (used[i]) continue
            // 确保在同一层级的递归中,相同的元素只被使用一次
            // 如果当前元素与前一个元素相同,并且前一个元素未被使用,则跳过当前元素。
            if (i > 0 && nums[i] === nums[i - 1] && !used[i - 1]) continue
            used[i] = true
            one.push(nums[i])
            backtrack(one)
            used[i] = false
            one.pop()
        }
    }
    backtrack([])
    return res
};

说实话,我还是有点不太理解,为什么当前元素没有被使用过,且前面的元素也没有被使用过,为什么要跳过当前元素的这个操作

附加一个示意图

图解.png