回溯 时间复杂度 O(n * n!)

时间复杂度分析:

  1. 第一次从n个数中选 第二次从n - 1个数选… 总共的选择 n!
  2. 递归结束时 复制数组时间复杂度 O(n)
  3. 综合1 2 总复杂度 O(n * n!)
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
'''
把 nums数组分为左右两边 维护一个分界索引
每次把 从剩下的元素中选出的元素挪到左边去
'''
n = len(nums)
res_list = []
def doit(first):
if first == n:
res_list.append(nums[:])
# 每一层都在右侧剩余元素中选择一个元素
for i in range(first, n):
# 选出的元素加入左侧
nums[i], nums[first] = nums[first], nums[i]
# 分界索引+1 去下一层
doit(first + 1)
# 之后 记得把元素再交换回来 开启下一轮循环
nums[i], nums[first] = nums[first], nums[i]
doit(0)
return res_list