📝Leetcode 47. 全排列 II

183 阅读1分钟

题目🌵

📝Leetcode 47. 全排列 II

✏️leetcode-cn.com/problems/pe…


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

示例 1:

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

解题思路💡

  • 递归+回溯

  • 回溯的本质就是穷举,我们这里可以抽象成一个n叉树

    • 回溯需要终止条件

    • 在当前题目中,当路径中的元素个数===数组元素个数,即为一组排列组合

      if (path.length === nums.length) {
          res.push([...path])     //当数组元素===原来数组的个数,说明一种排列组合完成
          //递归终止
          return
      }
      
    • 定义used数组,为了保证当前的排列中用的元素唯一

  • 需要考虑重复的元素,首先需要一个有序数组,然后在递归层进行剪枝操作

var permuteUnique = function (nums) {
    nums.sort((a, b) => a - b)
    const res = [],
        path = []
    backTracking([])
    return res

    function backTracking(used) {
        if (path.length === nums.length) {
            res.push([...path])
            return
        }
        for (let i = 0; i < nums.length; i++) {
            //去重,在树层上剪去重复的分支
            if (i > 0 && nums[i] === nums[i - 1] && !used[i - 1]) {
                continue
            }
            if (!used[i]) {
                path.push(nums[i])
                used[i] = true
                backTracking(used)
                path.pop()
                used[i] = false
            }
        }
    }
}

image-20220304112552431