题目:
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
解答:
方法一:树层去重
class Solution:
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
res=[]
path=[]
def tarcebacking(nums,used):
if len(path)==len(nums):
res.append(path[::])
return
for i in range(len(nums)):
#used[i - 1] == true,说明同一树支nums[i - 1]使用过
#used[i - 1] == false,说明同一树层nums[i - 1]使用过
#如果同一树层nums[i - 1]使用过则直接跳过
if i!=0 and nums[i]==nums[i-1] and used[i-1]==False:
continue
if used[i]:
continue
used[i]=True
path.append(nums[i])
tarcebacking(nums,used)
path.pop()
used[i]=False
n=len(nums)
used=[False]*n
nums.sort()
tarcebacking(nums,used)
return res
方法二:树枝去重
class Solution:
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
res=[]
path=[]
def tarcebacking(nums,used):
if len(path)==len(nums):
res.append(path[::])
return
for i in range(len(nums)):
#used[i - 1] == true,说明同一树支nums[i - 1]使用过
#used[i - 1] == false,说明同一树层nums[i - 1]使用过
#如果同一树枝nums[i - 1]使用过则直接跳过(效率较低,不推荐使用)
if i!=0 and nums[i]==nums[i-1] and used[i-1]==True:
continue
if used[i]:
continue
used[i]=True
path.append(nums[i])
tarcebacking(nums,used)
path.pop()
used[i]=False
n=len(nums)
used=[False]*n
nums.sort()
tarcebacking(nums,used)
return res
方法三:使用uset对树层(同一父节点的本层)去重
class Solution:
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
res=[]
path=[]
def tarcebacking(nums,used):
if len(path)==len(nums):
res.append(path[::])
return
uset=set()
for i in range(len(nums)):
#同层去重
if nums[i] in uset:
continue
#数组中的第i个元素如果使用过,就跳过
if used[i]:
continue
uset.add(nums[i])
used[i]=True
path.append(nums[i])
tarcebacking(nums,used)
path.pop()
used[i]=False
n=len(nums)
used=[False]*n
nums.sort()
tarcebacking(nums,used)
return res