栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

从数组中获取大小为n的所有组合的算法(Java)?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

从数组中获取大小为n的所有组合的算法(Java)?

这是生成所有k子集或k组合的经过充分研究的问题,无需递归即可轻松完成。

这个想法是要使大小数组

k
保持输入数组中元素 索引 的顺序(顺序是从
0
到的数字
n -1
),顺序是递增的。(然后可以通过从初始数组中按这些索引获取项来创建 子集。)因此,我们需要生成所有此类索引序列。

第一个索引序列将是

[0, 1, 2, ... , k - 1]
,在第二步将切换到
[0, 1, 2,..., k]
,然后切换到
[0, 1, 2,... k + 1]
等等。最后一个可能的顺序是
[n - k, n - k + 1, ..., n - 1]

在每个步骤中,算法都会寻找最接近可以增加的最终物料,将其递增并填充到该物料的右侧。

为了说明,请考虑

n = 7
k = 3
。第一个索引序列是
[0, 1, 2]
,然后
[0, 1,3]
依此类推…在某些时候,我们有
[0,5, 6]

[0, 5, 6] <-- scan from the end: "6" cannot be incremented, "5" also, but "0" can be[1, ?, ?] <-- "0" -> "1"[1, 2, 3] <-- fill up remaining elementsnext iteration:[1, 2, 3] <-- "3" can be incremented[1, 2, 4] <-- "3" -> "4"

因此,

[0, 5, 6]
接着是
[1, 2, 3]
,然后继续,依此类推
[1, 2, 4]

码:

int[] input = {10, 20, 30, 40, 50};    // input arrayint k = 3;       // sequence lengthList<int[]> subsets = new ArrayList<>();int[] s = new int[k];       // here we'll keep indices       // pointing to elements in input arrayif (k <= input.length) {    // first index sequence: 0, 1, 2, ...    for (int i = 0; (s[i] = i) < k - 1; i++);      subsets.add(getSubset(input, s));    for(;;) {        int i;        // find position of item that can be incremented        for (i = k - 1; i >= 0 && s[i] == input.length - k + i; i--);         if (i < 0) { break;        }        s[i]++;         // increment this item        for (++i; i < k; i++) {    // fill up remaining items s[i] = s[i - 1] + 1;         }        subsets.add(getSubset(input, s));    }}// generate actual subset by index sequenceint[] getSubset(int[] input, int[] subset) {    int[] result = new int[subset.length];     for (int i = 0; i < subset.length; i++)         result[i] = input[subset[i]];    return result;}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/486759.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号