美文网首页
从数组中取 n 个数的所有组合

从数组中取 n 个数的所有组合

作者: 永远保持一颗进取心 | 来源:发表于2017-07-31 15:12 被阅读253次

用递归实现:
1.确定要取的每个组合的元素个数;
2.对于每个组合,按照索引大小,先取第一个,此时要取的个数减 1,
3.按照第二步的逻辑重复,直至一个完成组合取值;
4.下一个组合重复第2,3步.

或者可以这样说:

例如每个组合要在 {1, 2, 3, 4, 5} 取 3 个数,
第一个数可以取 1, 2 或 3(4, 5 不能取是因为每个组合要 3 个数), 假设取 n( n <= 5 - 2).
第二个数就可以在 [n+1 5]中取一个值 m(m <= 5 -1)
第三个可以在 [m+1 5] 取一个值,这样就可以组成一个组合

这个逻辑类似数据结构中的 树, 第一个数取 1 , 子树则有 2, 3,4
子树取 2, 子树的子树则有 3, 4, 5.

#include <stdio.h>

/**
 @param arr 数组
 @param length 数组长度
 @param start 遍历开始索引
 @param getcount 需要取的组合里的元素个数
 @param tempArr 每个组合的数据缓存
 @param tempLength 组合的长度
 @param total 组合个数
*/

void printCombination(int *arr, const int length, int start, int getcount, int *tempArr, const int tempLength, int *total) {
    if(getcount == 0) { //对应第 3 步, 此时打印出一个组合
        (*total)++;
        for(int index = 0; index < tempLength; index++) {
            printf("%d ", tempArr[index]);
        }
        printf("\n");
        return;
    }
    
    if(getcount > (length - start) || tempLength < getcount || getcount < 1) {//
        return;
    }
    
    for(int i = start; i < length; i++) {
        tempArr[tempLength - getcount] = arr[i];//对应第 2 步
        printCombination(arr, length, i + 1, getcount - 1, tempArr, tempLength, total); 
    }
}

int main(int argc, char *argv[]) {
    int a = 0;
    int *total = &a;
    int arr[] = {1, 2, 3, 4, 5, 6};
    int temp[] = {0, 0, 0};
    printCombination(arr, 6, 0, 4, temp, 4, total);
    printf("total: %d \n", (int)*total);
}

打印结果

1 2 3 4 
1 2 3 5 
1 2 3 6 
1 2 4 5 
1 2 4 6 
1 2 5 6 
1 3 4 5 
1 3 4 6 
1 3 5 6 
1 4 5 6 
2 3 4 5 
2 3 4 6 
2 3 5 6 
2 4 5 6 
3 4 5 6 
total: 15 

相关文章

  • 从数组中取 n 个数的所有组合

    用递归实现:1.确定要取的每个组合的元素个数;2.对于每个组合,按照索引大小,先取第一个,此时要取的个数减 1,3...

  • 排列组合--原理及实现

    1. 定义: 组合数:从m个不同元素中任取n(n<=m)个元素拼成一组,叫做从m中取n个元素的组合。能够取的所有可...

  • 组合

    上述代码中列出了 全组合的非递归、递归解法 从n个数中取m个的各种组合形式输出

  • 关于n个数里选k个的不同方法及一些思考

    给出两个整数n和k,返回从1到n中取k个数字的所有可能的组合例如:如果n=4,k=2,结果为[↵ [2,4],↵...

  • TODO:排列组合问题:n个数中取m个

    TODO:排列组合问题:n个数中取m个 排列组合是组合学最基本的概念。所谓排列,就是指从给定个数的元素中取出指定个...

  • 子集、组合、排列算法

    列出所有 1...n 的子集 输出 从 1...n 选 m 个数,列出所有组合 输出 从 1...n 选 m 个数...

  • 组合数算法

    一、概念 什么是组合数呢? 从m个不同元素中取出n(n≤m)个元素的所有组合的个数,叫做从m个不同元素中取出n个元...

  • 从数组中取N个数的排列数

    键盘九宫格最前面的英文字分别是a、d、g、j、m、p、t、w,想拼成一个网易邮箱号,6位,有多少排列?

  • R语言-组合全排列问题

    问题1:5组数据,从每组数据中抽取n个全组合,列出所有组合 结果1 问题2:5组数据,随机从每组数据中抽取n个数据...

  • [leetcode Combinations] 使用递归代替任意

    先附上原题: 给定两个数n和k,写出所有k个数字的组合,数值范围从1~n,并且每一个组合中的数字不得重复。这道题目...

网友评论

      本文标题:从数组中取 n 个数的所有组合

      本文链接:https://www.haomeiwen.com/subject/cpcrlxtx.html