整数数组的组合问题

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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值