题目描述
给定一个不含重复数字的整数数组 nums
,返回其 所有可能的全排列 。可以 按任意顺序 返回答案。
样例输入
示例 1:
输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例 2:
输入:nums = [0,1] 输出:[[0,1],[1,0]]
示例 3:
输入:nums = [1] 输出:[[1]]
提示:
1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums
中的所有整数 互不相同
题解
本题与组合问题很类似,依旧使用for循环控制每层遍历,使用递归控制每个树枝上的深层遍历。在组合问题中,笔者详细说明了回溯算法的图解表示,详情可见
在本题中,使用回溯算法与组合问题的对比,只有两个不同点
- 对于每次遍历,其起始位置都从0开始,而不再使用startIndex控制每层的遍历起始位置,因为全排列是无序的,对于[1,2]和[2,1]是两个不同的排列
- 由于每次遍历的起始位置都从0开始,因此要额外使用一个used数组,用于对每个元素的遍历进行标记
是的,这其实就是最原始的DFS算法应用
代码
class Solution {
private:
vector<int> path;
vector<vector<int>> res;
public:
void backing(vector<int>&nums,vector<int>used)
{
if(path.size()==nums.size())
{
res.push_back(path);
return ;
}
for(int i=0;i<nums.size();i++)
{
if(used[i]==1) continue;
used[i]=1;
path.push_back(nums[i]);
backing(nums,used);
path.pop_back();
used[i]=0;
}
}
vector<vector<int>> permute(vector<int>& nums) {
vector<int> used(nums.size(),0);
backing(nums,used);
return res;
}
};