思路:对于[1,2,3]而言,我们可以先固定1,然后对2,3进行全排列;同样的,可以固定2,对1,3进行全排列……
因此,我们可以采用递归的方式求解。
具体地,我们使用两个变量nl和nr,nl代表固定好的数字们,nr代表剩余要进行全排列的数字们。
然后每次从nr中抽出一个新的数字加入到nl,然后不断抽,直到nr中没有数字,代表一个排列完成,然后回溯找下一个排列。
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
result=[]
def p(nl,nr):
if nr==None or len(nr)==0:
result.append(nl)
return
for n in nr:
nlc=nl.copy()
nrc=nr.copy()
nlc.append(n)
nrc.remove(n)
p(nlc,nrc)
return
p([],nums)
return result
注意到:python中list.append(value)的返回值为None,因此这里我先进行了copy。
另一种代替copy的更加简洁的写法是采用set集合。
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
result=[]
def p(nl,nr):
if nr==None or len(nr)==0:
result.append(nl)
return
for n in nr:
p(nl+[n],set(nr)-set([n]))
return
p([],nums)
return result