这道题我的思路大致是一层一层的构造全排列,先构造1个元素的全排列,再构造2个的,以此类推,直到构造完所有元素的全排列。在由i个元素全排列构造(i+1)个元素的全排列时,只需要把新加的元素放在之前i个元素的所有全排列的首尾或中间即可。需要注意的是深拷贝和浅拷贝的问题,’='赋值属于浅拷贝,也就是说在被赋值的list上操作时,用来赋值的list也会被改变。如果想要被赋值list和原list不再占用一个空间,也就是说重新创建一个全新的list时,就需要用到深拷贝。深拷贝使用的copy库中的deepcopy函数:
import copy
l2 = copy.deepcopy(l1)
之后对l2进行的任何操作都不会影响l1。
这道题的完整代码如下:
import copy
class Solution:
def solve(self, perm: List[List[int]], num: int) -> List[List[int]]:
result = []
l = len(perm)
for i in range(l):
l1 = len(perm[i])
for j in range(l1+1):
tmp = copy.deepcopy(perm[i])
tmp.insert(j, num)
result.append(tmp)
return result
def permute(self, nums: List[int]) -> List[List[int]]:
result = [[]]
for num in nums:
result = self.solve(result, num)
return result