博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java基础:遍历m取n的所有组合(转)
阅读量:2504 次
发布时间:2019-05-11

本文共 1161 字,大约阅读时间需要 3 分钟。

java基础:遍历m取n的所有组合(转)[@more@]/**
*
* 求m取n的所有组合。   * m个数分别为0,1,2...m-1.   * 算法简述:   *   二个组合,若仅有元素顺序不同,视其为同一个组合。   *   左位系低位,右位系高位。   *   按自然的取法取第一个组合(各数位分别是:0,1,2...n-1),以后的所有组合都经上一个组合变化而来:   *   从右至左,找到有增量空间的位,将其加1,使高于该位的所有位,均比其左邻位大1,从而形成新的组合。   *   若所有位均无增量空间,说明所有组合均已被遍历。   *   使用该方法所生成的组合数中:对任意组合int[] c,下标小的数必定小于下标大的数.   *
*/
public class Combination {
int n, m;
int[] pre;//previous combination.
public Combination(int n, int m) {
this.n = n;
this.m = m;
}
/**
* 取下一个组合。可避免一次性返回所有的组合(数量巨大,浪费资源)。
* if return null,所有组合均已取完。
*/
public int[] next() {
if (pre == null) {//取第一个组合,以后的所有组合都经上一个组合变化而来。
pre = new int[n];
for (int i = 0; i < pre.length; i++) {
pre
= i;
}
int[] ret = new int[n];
System.arraycopy(pre, 0, ret, 0, n);
return ret;
}
int ni = n - 1, maxNi = m - 1;
while (pre[ni] + 1 > maxNi) {//从右至左,找到有增量空间的位。
ni--;
maxNi--;
if (ni < 0)
return null;//若未找到,说明了所有的组合均已取完。
}
pre[ni]++;
while (++ni < n) {
pre[ni] = pre[ni - 1] + 1;
}
int[] ret = new int[n];
System.arraycopy(pre, 0, ret, 0, n);
return ret;
}
}

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10617731/viewspace-963578/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10617731/viewspace-963578/

你可能感兴趣的文章
type=button和type=submit
查看>>
感冒食疗方法
查看>>
[Linux]安装phpredis扩展
查看>>
Behavioral Patterns Part 1/11: Chain Of Responsibility Pattern
查看>>
JAVA-初步认识-第六章-成员变量和局部变量的区别
查看>>
JAVA-初步认识-常用对象API(集合框架-ListIterator接口)
查看>>
Hadoop伪分布模式操作
查看>>
JDBC请求
查看>>
[九度][何海涛] 最大子向量和
查看>>
[CareerCup][Google Interview] Find kth number in a BST
查看>>
BZOJ 4033 [HAOI2015]树上染色
查看>>
自我介绍
查看>>
socket短时间内重连需注意的问题
查看>>
magnitude是精确距离,sqrMagnitude是节省CPU的粗略距离,精度有损失
查看>>
2.使用Python解释器
查看>>
合并多个commit
查看>>
Docker学习--Linux基础准备篇
查看>>
centos6安装部署git服务器(gitlab6.4)
查看>>
P1439 【模板】最长公共子序列 离散化
查看>>
51nod 1197 字符串的数量 V2(矩阵快速幂+数论?)
查看>>