46.全排列
1.题目
2.我的解决方案
- 想到了用回溯,但是在调整顺序方面出了问题
3.官方的解决方案
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
# 类似于子集问题:考虑使用回溯算法:深度优先遍历,所有的结点就是答案
def dfs(begin):
if begin == length: # 1.叶子结点的处理方法
res.append(nums[:])
for i in range(begin, length):
nums[begin], nums[i] = nums[i], nums[begin] # 动态维护数组
dfs(begin+1) # 注意递归传递的参数
nums[begin], nums[i] = nums[i], nums[begin] # 状态还原
length = len(nums)
res = [] # 2. 定义结果数组
dfs(0)
return res
- 时间复杂度: O ( n ∗ n ! ) O(n*n!) O(n∗n!) :回溯递归调用的时间复杂度是 O ( n ! ) O(n!) O(n!),同时,将答案进行copy需要花费 O ( n ) O(n) O(n)的时间复杂度
- 空间复杂度: O ( n ) O(n) O(n)