给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
这是一个经典的题目F(1,2,3)=F(1)F(2,3)+F(2)F(1,3)+F(3)F(1,2),从1到n开始遍历,每次把i和第一个数交换,然后后面递归,交换完后一定要交换回来进行下一次递归。
class Solution {
public:
void dfs(int start,int end, vector<int> &nums, vector<vector<int>> &res)
{
if(start==end)
{
res.push_back(nums);
return;
}
for(int i=start;i<end;i++)
{
swap(nums[start],nums[i]); // 每次交换start和i个元素
dfs(start+1,end,nums,res); // 然后递归搜索下去
swap(nums[start],nums[i]); // 交换回来,进行下一次
}
}
vector<vector<int>> permute(vector<int>& nums)
{
int n = nums.size();
vector<vector<int>> res;
dfs(0,n,nums,res);
return res;
}
};