https://leetcode.cn/problems/permutations-ii/
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
示例 1:
输入:nums = [1,1,2]
输出:
[[1,1,2],
[1,2,1],
[2,1,1]]
class Solution:
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
# 难度:☆☆☆
# 标签:回溯
# 排列:元素重复不可复选(排序+剪枝)
from copy import deepcopy
path, result, n = [], [], len(nums) # 子集组合排列回溯三剑客
nums.sort() # 有重复必选排序
used = [0] * n # 排列专属
def bakctrack(start):
if len(path) == n: # 到达叶子节点,收割结果
result.append(deepcopy(path)) # result.append(path[:])
return
# for循环横向遍历
for i in range(n):
if used[i] == 1: # 剪枝
continue
if i > 0 and nums[i] == nums[i - 1] and used[i - 1] == 0: # 去重
continue
# 做选择
used[i] = 1
path.append(nums[i])
# 递归,纵向遍历,进入下一层回溯树
bakctrack(i + 1) # 可复选从i开始
# 取消选择
used[i] = 0
path.pop()
bakctrack(0)
return result