相比46题主要变化在于需要维护一个used数组(位置上的值为0代表当前数字在当前层没有被考虑过或者经过回溯之后已经被考虑过)
当前位置的数字没有出现过
if not used[i]:
当前位置的数字和前一个一样且前一个数字经过回溯之后已经被考虑则跳过当前的选择
if i>0 and nums[i] == nums[i-1] and not used[i-1]:
continue
class Solution:
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
if not nums: return []
res = [] #存放符合条件结果的集合
used = [0] * len(nums)
def backtrack(nums, used, path):
if len(path) == len(nums):
res.append(path.copy())
return
for i in range(len(nums)):
if not used[i]:
if i>0 and nums[i] == nums[i-1] and not used[i-1]:
continue
used[i] = 1
path.append(nums[i])
backtrack(nums, used, path)
path.pop() #回溯
used[i] = 0
backtrack(sorted(nums), used, [])
return res