2015年9月16日,美团南京站南京邮电大学笔试题目之一。
大致的题意是这样的:
有一个元素各不相同的整数数组,输入元素的所有组合,长度由大到小。例如:[1, 2, 3, 4],依次输出1234,123,134,234,12,13,14,23,24,1,2,3,4
思路:
1、设输出的组合的长度为m(m<=n)
2、把数组分为两个部分:第一个数和后面的m-1个数
3、如果组合里包含第一个数,则下一步在剩余的n-1个数里选取m-1个字符;如果不包含第一个数,则下一步在剩余的m-1个数里面选取m个数
把n个数中求长度为m的组合分解成:求n-1个数长度为m-1的组合,以及n-1个数里面求长度为m的组合的两个子问题,用递归解决。另外,可以使用vector或者statck数据结构存储当前的结果,本文采用的是vector。
// totalLen:数组长度,curIndex:递归过程中的“第一个”元素在数组中的位置, // lengthLeft:组合中需要添加的元素个数,res:存放当前组合的元素 void combine(int *a, int totalLen, int curIndex, int lengthLeft, vector<int> &res) { if (lengthLeft == 0){ vector<int>::const_iterator iter = res.begin(); for (; iter != res.end(); ++iter) cout << *iter; cout << "\n"; return; } // 若递归过程中希望作为“第一个元素”的位置已超过数组的长度,则退出 if (curIndex == totalLen) return; res.push_back(a[curIndex]); combine(a, totalLen, curIndex + 1, lengthLeft - 1, res); res.pop_back(); combine(a, totalLen, curIndex + 1, lengthLeft, res); } void combinationOfInt(int *a, int len) { if (!a) return; vector<int> res; for (int i = len; i >= 1; --i) combine(a, len, 0, i, res); } int main(void) { int a[] = { 1, 2, 3, 4, 5 }; combinationOfInt(a, 5); return 0; }
原文地址:http://blog.csdn.net/dzyhenry/article/details/39344779