无重全排列递归解法
class Solution:
def permute(self, nums):
res= []
self.recur([],nums,res)
return res
def recur(self,head,tail,res):
if len(tail)<=1:
res.append(head+tail)
return
for v in tail:
self.recur(head+[v],[i for i in tail if i!=v],res)
有重全排列递归解法
class Solution:
def permuteUnique(self, nums):
res= []
self.recur([],nums,res)
return res
def recur(self,head,tail,res):
if len(tail)<=1:
res.append(head+tail)
return
r = []
for i,v in enumerate(tail):
if v not in r:
self.recur(head+[v],[tail[j] for j in range(len(tail)) if j!=i],res)
r.append(v)
简单解法
设计一个列表,每次放入一个数字,将数字可能放的位置全部记录一遍,重复的项只放相同之前的位置,例如【1,2,3…n】,将n+1放入其中,有n+1种放法,若将n放入其中,则只有n种
[1,1,2]>[[1]]>>[[1,1]]==>[[2,1,1],[1,2,1],[1,1,2]]
class Solution:
def permuteUnique(self, nums):
ans = [[]]
for n in nums:
new_ans = []
for l in ans:
for i in range(len(l)+1):
new_ans.append(l[:i]+[n]+l[i:])
if i<len(l) and l[i]==n:
break #handles duplication
ans = new_ans
return ans