给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
简析:这道题看上去需要重复的规律性的操作,所以需要利用到递归,并且是DFS,每次生成一个排列组合之后,就需要将倒数第一个第二个或者更多依次退出。又因为每个位置都需要递归实现,所以每次成功之后指针就会指向下一个位置,避免了重复。
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>>res;
vector<int> temp;
vector<bool> used(nums.size(),false);
dfs(res,temp, nums, used);
return res;
}
public:
void dfs(vector<vector<int>> &res,vector<int> &temp,vector<int> &nums,vector<bool> &used)
{
if(temp.size() == nums.size())
{
res.push_back(temp);
return;
}
for (int i = 0; i < nums.size();i++)
{
if(!used[i])
{
temp.push_back(nums[i]);
used[i] = true;
dfs(res, temp, nums, used);
temp.pop_back();
used[i] = false;
}
}
}
};
PS:调用数组的时候,前面不加&的话,每次就是之前保存的那个数组,无法更新。