题目描述:
给定一个可包含重复数字的序列 nums
,按任意顺序 返回所有不重复的全排列。
示例 1:
输入:nums = [1,1,2] 输出: [[1,1,2], [1,2,1], [2,1,1]]示例 2:
输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]提示:
1 <= nums.length <= 8
-10 <= nums[i] <= 10
思路:
在Leetcode_46题目上进行修改
①首先要排序,排序过后相同的数字是相邻的,相邻数字之间比较容易比较
②如果nums[i-1]和nums[i]相同,并且visited[i-1]为false,则说明存在重复,跳过即可
代码:
class Solution(object):
def permuteUnique(self, nums):
if not nums:
return []
# visited初始化为False
visited = [False] * len(nums)
res = []
# 排序,后续根据相邻数字之间的关系来判断是否重复
nums.sort()
def dfs(res, visited, road, deep):
# 递归边界
if deep == len(nums):
res.append(road[:])
for i in range(len(nums)):
# i > 0 是因为防止i-1出错;nums[i - 1] == nums[i]表示相邻重复;visited[i - 1]表示的是访问i位置时,
# 如果i-1位置没有被访问过,也不需要访问,因为是重复的数字
if i > 0 and nums[i - 1] == nums[i] and not visited[i - 1]:
continue
if not visited[i]:
visited[i] = True
road.append(nums[i])
dfs(res, visited, road, deep + 1)
road.pop()
visited[i] = False
dfs(res, visited, [], 0)
return res
if __name__ == "__main__":
nums = [1, 1, 3]
a = Solution()
res = a.permuteUnique(nums)
print(res)