[Leetcode] Combinations


题目:

Given two integers n and k, return all possible combinations of k numbers out of 1 ... n.

For example,
If n = 4 and k = 2, a solution is:

[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]
即从n个数中取出k个,总共有多少种组合,很简单的递归搞定。

vector<vector<int> > comb;
void Comb(int begin, int n, int k, vector<int> vint) 
{
	if(k==0)
	{
		comb.push_back(vint);
		return;
	}
	
	for(int i=begin; i<=n-k+1; i++ )
	{
		vint.push_back(i);
		Comb(i+1, n, k-1, vint);
		vint.pop_back();
	}
	return;
}
vector<vector<int> > combine(int n, int k) 
{
    vector<int> vint;
    Comb(1, n,k, vint) ;
    return comb;
}


扩展:实现n个数的全部组合,如n=3,得到{[1,2,3],[1,2],[1],[2,3],[2],[3]}。

vector<vector<int> > comb;
void combinen(int begin, int n,  vector<int> vint) 
{

	if(begin > n)
	{
		if(vint.size()>0) comb.push_back(vint);
		return;
	}
	
	for(int i=begin; i<=n+1; i++ )      <span style="font-family: 'Microsoft YaHei';">//这里多加一个n,是为了push一个数的情况</span>
	{
		if(i<=n) vint.push_back(i);
		combinen(i+1, n,  vint);    //指到下一个元素,不能重复
		if(i<=n) vint.pop_back();
	}
	return;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值