给定一个可包含重复数字的序列 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
思路:这道题是在排列的基础上进一步变化,如果46.全排列没做的,建议先做那道题。
可以在那道题的基础上进行修改。
首先在那道题的基础上,我们可以得到这个数组所有的排列,但数组中可能有重复元素,也就会产生重复的排列,如例1:[1,1,2],以第一个为首,能得到的排列是[1,1,2]和[1,2,1],但以第二个1为首得到的排列也是[1,1,2]和[1,2,1],所以相同数字为首,我们只需要用一个获取全排列即可。
故在那道题的代码基础上,给每一层添加一个isUsed,因此在for循环里的条件变成if used[i] == 1 or nums[i] in isUsed: continue,前半部分used[i] == 1是为了得到全排列,后半部分nums[i] in isUsed是去除重复数字带来的重复全排列影响。
46.全排列题解:46. 全排列-CSDN博客
代码(Python):
class Solution(object):
def permuteUnique(self, nums):
result = []
path = []
used = [0] * len(nums)
def backtracking(used):
if len(path) == len(nums):
result.append(path[:])
return
isUsed = set()
for i in range(0,len(nums)):
if used[i] == 1 or nums[i] in isUsed: #去重
continue
used[i] = 1
isUsed.add(nums[i]) #已经使用过的数字放入isUsed,防止重复数字影响
path.append(nums[i])
backtracking(used)
path.pop()
used[i] = 0
backtracking(used)
return result