For example,
[1,2,3]
have the following permutations:
[1,2,3]
, [1,3,2]
, [2,1,3]
, [2,3,1]
, [3,1,2]
, and [3,2,1]
.
全排列:
从1开始递归,然后对2递归,最后对3递归
顺序是先输出 1 2 3 1 3 2 2 1 3 2 3 1 ............稍微分析一下就出来了
class Solution {
private:
vector<vector<int>>res;
vector<int>tmp;
public:
vector<vector<int> > permute(vector<int> &num) {
dfs(res,num,0);
return res;
}
void dfs(vector<vector<int>>&res,vector<int>&num,int cur)
{
int n=num.size();
if(cur==n)
{
res.push_back(num);
return;
}
for(int i=cur;i<n;i++)
{
swap(num[cur],num[i]);
dfs(res,num,cur+1);
swap(num[cur],num[i]);
}
}
};
类似的还有组合算法。这里给的是1.。。n数的K排列
class Solution {
private:
vector<int>tmp;
vector<vector<int>>res;
public:
vector<vector<int> > combine(int n, int k) {
if(n==0)
return res;
tmp.resize(k);
dfs(0,k,n,1);
return res;
}
void dfs(int depth,int maxDepth,int n,int start)
{
if(maxDepth==depth)
{
res.push_back(tmp);
return;
}
for(int i=start;i<=n;i++)
{
tmp[depth]=i;
dfs(depth+1,maxDepth,n,i+1);
}
}
};