突发奇想就是想利用递归方法来求解数字的排列组合的问题,感觉数字排列组合使用递归求解起来是比较方便简洁的,我们只需要定义好终止条件以及我们需要剪枝的一些条件。
问题1:给出一个正数n,我们需要求解出0到n-1范围内多个数字能组合成多少个数。例如,n=3,则可以组成:102、120、210、201四种数字组合。
其实通过我们的分析,由于0不能作为数字的首位,其余数字可以位于任何的位置,则最后的排列情况有 n*n! 次。
下面我们通过递归的方式来复杂化求解过程 虽然把问题从简单到复杂,但这也是有助于我们理解递归的过程,可以推导到更加复杂的排列组合情况。
解决方案:
#include#include #include using namespace std; void _combine(int &res, string str, int start, int n) { if (str.length()==n && str[0]!='0') { res += 1; return; } for (int i=start; i 问题2:给定两个整数n和k,从n中返回k个数字的所有可能组合。例如,n=4和k=2的情况下,返回的组合即如果为:
[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4]]解决方案:
#include#include #include using namespace std; void _combine(vector > &res, vector &tmp, int n, int k, int start) { if (tmp.size()==k) { res.push_back(tmp); return; } for (int i=start; i<=n; i++) { tmp.push_back(i); _combine(res, tmp, n, k, i+1); tmp.pop_back(); } } vector > combineNums(int n, int k) { vector > res; vector tmp; if (k>n || k==0) return res; _combine(res, tmp, n, k, 1); return res; } int main() { vector > res; res = combineNums(4, 2); for (int i=0; i 欢迎分享,转载请注明来源:内存溢出
评论列表(0条)