LeetCode:46 全排列 递归解法
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入:
[1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/permutations
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
直接递归:
- 使用一个没被使用的数字,填第i个位置,然后递归地填第i+1个位置,注意状态重置,即递归退栈的时候需要把填的数取出来
- 使用 visited 数组表示是否选取了数字
代码
class Solution
{
public:
vector<vector<int> > result;
vector<int> temp;
bool* visited;
int n;
// dfs + 状态重置
void dfs(vector<int>& temp, vector<int>& nums)
{
if(temp.size() == n)
{
result.insert(result.end(), temp);
}
else
{
for(int i=0; i<n; i++)
{
if(visited[i] == false)
{
visited[i] = true;
temp.insert(temp.end(), nums[i]);
dfs(temp, nums);
visited[i] = false;
temp.pop_back();
}
}
}
}
vector<vector<int>> permute(vector<int>& nums)
{
n = nums.size();
visited = new bool[n];
for(int i=0; i<n; i++)
{
visited[i] = false;
}
dfs(temp, nums);
return result;
}
};