一、题目描述
给定一个可包含重复数字的序列 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
`
二、代码
代码如下:
class Solution:
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
result = []
#回溯法,每次找一个未被添加进入tmp中的元素添加进入tmp,
#然后在数组中排除(没有删掉)已添加的元素,并将其作为递归方法中的新参数
#知道nums数组所有元素被选中,即nums为空时,记录当前的tmp数组,即为一种排列
def backtrack(nums, tmp):
#如果当前队列nums为空,则表明遍历到最底层元素,则将存储当前排列的tmp存入result,并返回上一层
if not nums:
if tmp not in result:
result.append(tmp)
return
#遍历当前nums
for i in range(len(nums)):
#nums[:i] + nums[i + 1:]表示排除了当前 nums[i]后剩下的数组
#tmp + [nums[i]] 表示当前的已被选中的 nums数组
backtrack(nums[:i] + nums[i + 1:], tmp + [nums[i]])
backtrack(nums, [])
print(result)
return result
三、解题思路
本题解法还是利用回溯法,回溯的大概思路是:每次在nums
数组中找一个未被添加进入tmp
(tmp用于记录数组排列)的数nums[i]
,然后将其添加进tmp
中,之后将除了nums[i]的剩余数组(nums[:i] + nums[i + 1:]
)作为新的输入条件放入回溯方法中。回溯结束的条件是:当前的数组nums
为空时,则表示所有数组元素已被添加进入tmp排列数组中。
值得注意的是,需要输出不重复的排列结果,只需要在result
添加tmp
时做一个判断即可。