题目描述:
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
方法1:递归回溯
主要思路:
(1)使用递归回溯,将每个字符和后面可能的选择进行交换,然后在此基础上再次调用递归回溯,既在当前选择基础上进行后续的选择,然后恢复当前层的选择,以能够让当前层的后面的其他选择可以实现;
(2)终止条件使用深度为减小到为0时,进行终止;
class Solution {
public:
void helper(vector<int>& nums,int start,int depth,vector<vector<int>>& res){
if(!depth){//满足条件时,终止
res.push_back(nums);
return ;
}
//遍历当前层的选择
for(int i=start;i<nums.size();++i){
swap(nums[start],nums[i]);//实现当前的选择
helper(nums,start+1,depth-1,res);//当前的选择下,进行后续的选择
swap(nums[start],nums[i]);//恢复当前的选择,以实现当前层后续的选择
}
}
vector<vector<int>> permute(vector<int>& nums) {
//处理特殊的情形
if(nums.empty())
return vector<vector<int>>();
vector<vector<int>> res;
helper(nums,0,nums.size(),res);//递归回溯
return res;
}
};