题目如下:
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
思路分析:通过上面的实例我们可以发现数组[1,2,3]的全排列就是让1做首位数字,2,3全排列,让2做首位数字,1,3全排列,让3做首位数字1,2全排列,而2,3的全排列又可以按照上面的套路,让2做首位数字,3的全排列,很明显只有一种,让3做首位数字2的全排列,所以这个题目可以通过递归来解决。而为了避免重复,我们需要每进行一次全排列之后复原数组,这样就是状态的回溯,所以回溯法的解决代码如下:
编程语言c++:
class Solution {
public:
vector<vector<int>>result;
void swap(vector<int>& nums,int q,int p)//两数交换的函数,用于每一个数字和首位数字交换
{
int temp=nums[q];
nums[q]=nums[p];
nums[p]=temp;
}
void prem(vector<int>& nums,int q,int p,vector<vector<int>>& result)//核心代码
{
if(p==q)//结束条件,只有一个元素了,就得到了这种条件下的全排列
result.push_back(nums);
else
{
for(int i=q;i<=p;i++)//通过循环交换首位元素
{
swap(nums,q,i);
prem(nums,q+1,p,result);//递归,解决除了首位之后的元素的全排列,直到达成终止条件
swap(nums,q,i);//恢复状态,既恢复到可以继续探索解的状态。
}
}
}
vector<vector<int>> permute(vector<int>& nums) {
int q=0,p=nums.size()-1;
prem(nums,q,p,result);
return result;
}
};