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


  • 相关阅读:
    UOJ #455 [UER #8]雪灾与外卖 (贪心、模拟费用流)
    Codeforces 482E ELCA (LCT)
    Codeforces 798D Mike and distribution (构造)
    AtCoder AGC017C Snuke and Spells
    HDU 6089 Rikka with Terrorist (线段树)
    HDU 6136 Death Podracing (堆)
    AtCoder AGC032D Rotation Sort (DP)
    jenkins+python+kubectl实现批量更新k8s镜像
    Linux 下载最新kubectl版本的命令:
    jenkins X 和k8s CI/CD
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6895978.html
Copyright © 2011-2022 走看看