46. 全排列
1. 题目
给定一个不含重复数字的数组 nums
,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例 1:
1 | 输入:nums = [1,2,3] |
示例 2:
1 | 输入:nums = [0,1] |
示例 3:
1 | 输入:nums = [1] |
提示:
1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums
中的所有整数 互不相同
2. 思路
- 已知题目要求获取输入数组的全排列结果集,同时
nums[i]
的取值为[-10, 10]
这个区间 - 初始化结果集
result
与访问标记值为-11
,同时采用通用回溯算法定义dfs
函数,回溯算法的模板为以下:
1 | void backtracking(参数) { |
- 本题中,回溯算法的参数为
nums
数组与list
临时结果集,其中终止条件为当list
结果子集长度与nums
数组长度一致时,将list
结果子集写入result
中 - 处理节点的过程中,需要判断哪些元素已经被使用,因此可以利用
nums[i]
取值区间,将已访问过的元素赋值为-11
,并且在当遇到已访问的元素时,将不对元素进行操作 - 一层回溯完成后,需要将已访问元素的标记进行还原,同时对
list
结果子集的结尾元素进行删除(撤销操作),完成整体回溯后,即可返回result
结果集
3. 代码
1 | class Solution { |
4. 复杂度
- 时间复杂度:
O(n * n!)
,其中n
为序列的长度 - 空间复杂度:
O(n)
,其中n
为序列长度,因为除了答案数组以外,递归函数在递归过程中需要为每一层递归函数分配栈空间,所需要的额外空间取决于递归的深度,因此调用深度为O(n)