8.combinations 组合
链接:http://www.lintcode.com/zh-cn/problem/combinations/
描述:
组给出两个整数n和k,返回从1......n中选出的k个数的组合。
例如 n = 4 且 k = 2
返回的解为:
[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4]]
分析:中等题,只是一个NP问题,通常用递归的方法去解答,类似N queens问题。主要思想就是一句话:有一个循环递归处理子问题,用一个判断使递归终止。对于本来说,递归终止的条件是当数组的大小等于指定的数组长度k,表示找到一组合法的数,放入保存的二维数组里面,返回。循环是n个数里面选择k个,从小到大选择。当有k个数之后,数组要不断删除数,才能放入新的数。
class Solution {
public:
/**
* @param n: Given the range of numbers
* @param k: Given the numbers ofcombinations
* @return: All the combinations of knumbers out of 1..n
*/
vector >combine(int n, int k) {
// write your code here
vector> ret;
if(n<0||n vec;
helper(ret,vec,1,n,k);
return ret;
}
void helper(vector>&ret,vector &vec,int beg,int n,int k)
{
if(vec.size()==k)
{
ret.push_back(vec);
return ;
}
for(int i=beg;i<=n;++i)
{
vec.push_back(i);
helper(ret,vec,i+1,n,k);
vec.erase(vec.end()-1);
}
}
};