给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ]
思路:
借鉴了别的博客的这张图。
深度优先搜索的思路(循环中递归)
全排列的产生过程:
每次检查当前位置能改变的值的个数依次是n*n-1****1 ,如何实现呢?
从当前位置i开始,向后遍历j直到最后一个数,每次与第i位置的数交换(为了去重,必须判断nums[j]是否已经交换过,可用一个list来保存已经出现过得发生交换的值)
递归实现:
class Solution(object):
def permuteUnique(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
# 思路:遍历每个位置 把当前位置和后面的位置交换(还未交换过的值才交换避免重复)
# 递归结构
n=len(nums)
if n<2:return [nums]
res=[]
self.permute(nums,n,0,res)
return res
def permute(self,nums,n,start,res):
if start>=n-1:
res.append(nums[:])
return
i=start
used=[]
while i<n:
if nums[i] not in used:
nums[i],nums[start]=nums[start],nums[i]
self.permute(nums,n,start+1,res)
# 注意一次交换完后,要还原数组
nums[i],nums[start]=nums[start],nums[i]
used.append(nums[i])
i+=1