题目描述
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
解题思路
参考无重复数字全排列,只需要多一步去重的操作即可。
# List 的in 操作比较耗时,特别是List元素较多时。
class Solution:
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
res = []
def backtrack(nums,tmp):
if not nums:
if tmp not in res:
res.append(tmp)
return
for i in range(len(nums)):
backtrack(nums[:i]+nums[i+1:],tmp+[nums[i]])
backtrack(nums,[])
return res
还有一种比较快速的解法,用字典记录数组中不重复的数字,以及他们出现的频次,每次组合一个数字,该数字频次减1,一种排列完成,进行回溯,直到找到所有的排列。
class Solution:
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
N = len(nums)
dic = {}
for each in nums:
if each not in dic:
dic[each] = 1
else:
dic[each] += 1
res = []
def backtrack(dic,path):
if len(path) == N:
res.append(path[:])
for i in dic.keys():
if dic[i] == 0:
continue
path.append(i)
dic[i] -= 1
backtrack(dic,path)
dic[i] += 1
path.pop()
backtrack(dic,[])
return res