给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
思路:
递归加回溯就可以解决。算法上没有难点,细节上可以动态地改变数组,将已经用过的数字放到数组的前面,没用过的放在后面,这样就不需要额外的空间来记录已经用过的数字。
class Solution {
public:
void per(vector<int>& input,vector<vector<int> >& output,vector<int>& ans,int index){
for(int i=index;i<input.size();++i){
//将本轮要使用的数字放到index位置,这样对于下一层递归,这个数字就是使用过的。
int tmp=input[index];
input[index]=input[i];
input[i]=tmp;
ans.push_back(input[index]);
if(ans.size()==input.size()) output.push_back(ans);
else{
per(input,output,ans,index+1);
}
//将位置还原就实现了回溯
ans.pop_back();
input[i]=input[index];
input[index]=tmp;
}
}
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int> > output;
vector<int> ans;
per(nums,output,ans,0);
return output;
}
};