zoukankan      html  css  js  c++  java
  • 整数数组的组合问题

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


  • 相关阅读:
    IT常用英文术语解释发音
    大数据公司宣传语 公司文化企业文化
    vue 开发环境搭建,超级简单仅需3步。
    Mvc action间的传值
    获取文件路径
    WebStorm注册码
    webstrom快捷键
    Nuget-使用图形化界面打包自己的类库
    使用StyleCop进行代码审查
    InstallShield Limited Edition for Visual Studio 2013 图文教程(教你如何打包.NET程序)
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6895978.html
Copyright © 2011-2022 走看看