原题
Given a collection of numbers that might contain duplicates, return all possible unique permutations.
Example:
Input: [1,1,2]
Output:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
解法1
使用itertools.permutations返回排列组合, 然后将结果放入集合中, 最后将集合转化为列表
代码
class Solution(object):
def permuteUnique(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
ans = set(tup for tup in itertools.permutations(nums))
return list(ans)
解法2
DFS.使用DFS将所有组合都放入结果里, 然后使用集合去掉重复值.
代码
class Solution(object):
def permuteUnique(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
def dfs(nums, path, res):
if len(nums) == 0:
res.append(path)
return
for i in range(len(nums)):
dfs(nums[:i] + nums[i+1:],path + [nums[i]], res)
nums.sort()
res = []
dfs(nums, [], res)
res = set(tuple(l) for l in res)
return list(res)
解法3
DFS + backtracking. 定义DFS函数, 回溯的条件是当nums长度为0时, 表示我们已经取完所有数字了, 此时将path加到结果里, 然后遍历nums, 当nums[i] == nums[i-1]时, 使用continue去掉重复值.
代码
class Solution(object):
def permuteUnique(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
def dfs(nums, path, res):
if len(nums) == 0:
res.append(path)
return
for i in range(len(nums)):
if i > 0 and nums[i]==nums[i-1]:
continue
dfs(nums[:i]+nums[i+1:], path+[nums[i]], res)
nums.sort()
res = []
dfs(nums, [], res)
return res