给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
]
官方方法的解释:
设我们有 33 个重复数排完序后相邻,那么我们一定保证每次都是拿从左往右第一个未被填过的数字,即整个数组的状态其实是保证了 [未填入,未填入,未填入] 到 [填入,未填入,未填入],再到 [填入,填入,未填入],最后到 [填入,填入,填入] 的过程的,因此可以达到去重的目标。
from typing import *
class Solution:
def __init__(self):
self.res = []
self.visited = None
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
nums.sort()
n = len(nums)
self.visited = [False] * n
self.dfs([], nums)
return self.res
def dfs(self, tem_list, nums):
if len(tem_list) == len(nums):
self.res.append(tem_list[:])
return
for i in range(0, len(nums)):
# 在这里选择可以添加的元素是什么
if self.visited[i] or (i>0 and nums[i] == nums[i - 1] and not self.visited[i - 1]):
continue
tem_list.append(nums[i])
self.visited[i] = True
self.dfs(tem_list, nums)
self.visited[i] = False
tem_list.pop()