生成排列
生成[1,2,3]的全排列
dfs用来生成排列,但是不彻底理解就完全是在凑巧。
wrong case
下面代码
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
vector<int> path;
dfs(nums,0,path,res);
return res;
}
void dfs(vector<int>& nums,int pos,vector<int>& path,vector<vector<int>>& res)
{
if(nums.size()==pos)
{
res.push_back(path);
return;
}
for(int i=pos;i<nums.size();i++)
{
path.push_back(nums[i]);
dfs(nums,pos+1,path,res);
path.pop_back();
}
}
};
输入[1,2,3],输出是[[1,2,3],[1,3,3],[2,2,3],[2,3,3],[3,2,3],[3,3,3]]。
用树来跟踪一下
pos=0,path=[]
i=0
path=[1],pos=1(pos更新后)
i=1
path=[1,2],pos=2
i=2
path=[1,2,3]
i=2
path=[1,3],pos=2
i=2
path=[1,3,3]
i=1
path=[2],pos=1
i=1
path=[2,2],pos=2
i=2
path=[2,2,3]
i=2
path=[2,3],pos=2
i=2
path=[2,3,3]
i=2
i=2的大分支省略。现在很清晰了。
right case
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
vector<int> path;
vector<int> used(nums.size(),0);
dfs(nums,path,res,used);
return res;
}
void dfs(vector<int>& nums,vector<int>& path,vector<vector<int>>& res,vector<int>& used)
{
if(nums.size()==path.size())
{
res.push_back(path);
return;
}
for(int i=0;i<nums.size();i++)
{
if(used[i]==0)
{
used[i]=1;
path.push_back(nums[i]);
dfs(nums,path,res,used);
path.pop_back();
used[i]=0;
}
}
}
};
这里没有用pos,因为这个逻辑很简单,就是把没用过的依次放进来,放够了就行。
同样用树来跟踪一下
used=[0,0,0],path=[]
i=0
used=[1,0,0],path=[1]
i=0 no
i=1
used=[1,1,0],path=[1,2]
i=0 no
i=1 no
i=2
used=[1,1,1],path=[1,2,3]
i=2
used=[1,0,1],path=[1,3]
i=0 no
i=1
used=[1,1,1],path=[1,3,2]
i=2 no
i=1
i=2
省略了1,2大分支。这下也很清晰了。