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

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

示例 2:

  1. 输入:nums = [1,2,3]
  2. 输出:[[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

    解法一:回溯

    1. function permuteUnique(nums: number[]): number[][] {
    2. let res : Array<Array<number>> = []
    3. nums.sort((a,b) => a-b)
    4. let n = nums.length
    5. let used = Array(n).fill(false)
    6. recursion([])
    7. return res
    8. function recursion(cur :Array<number>) {
    9. if(cur.length === n) {
    10. res.push([...cur])
    11. return
    12. }
    13. for (let [i, num] of nums.entries()) {
    14. if (used[i]) {
    15. continue
    16. }
    17. // 这里的剪枝条件需要增加前一个已经使用的
    18. // 如果当前和前一个一样,那么存在两种情况,
    19. // 一种是前一个已经使用了,那么当前可以正常使用,
    20. // 如果前一个没使用,表示其已经进入到使用之后的逻辑了,所以当前这个不能用
    21. if (i > 0 && num === nums[i-1] && !used[i-1]) {
    22. continue
    23. }
    24. cur.push(num)
    25. used[i] = true
    26. recursion(cur)
    27. cur.pop()
    28. used[i] = false
    29. }
    30. }
    31. }