C递归版的全排列和组合算法
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); } } };
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。