java基礎:遍歷m取n的所有組合(轉)
java基礎:遍歷m取n的所有組合(轉)[@more@]/**
*
*/
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;
}
}
*
* 求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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java基礎06 組合Java
- Java8集合遍歷Java
- JAVA 隔N行取一行寫入新文字,遍歷TXT文字Java
- N叉樹——前序遍歷
- Winform 遍歷 ListBox中的所有項ORM
- 元組遍歷
- JAVA基礎 練習-13-ArrayList集合學生物件遍歷Java物件
- 圖論演算法遍歷基礎圖論演算法
- JavaScript基礎 —— DOM:遍歷 與 範圍JavaScript
- 遍歷目錄下的所有檔案
- JS 基礎篇(七):JS中的遍歷函式JS函式
- 遞迴遍歷網站所有 url遞迴網站
- Java List集合去重、過濾、分組、獲取資料、求最值、合併、排序、跳資料和遍歷Java排序
- Python字典的遍歷,包括key遍歷/value遍歷/item遍歷/Python
- matlab遍歷資料夾下的所有檔案Matlab
- Java遍歷Map集合的方法Java
- java陣列遍歷的方法Java陣列
- Python基礎-列表操作(2):列表的遍歷和數字列表Python
- 前端面試題_06_parseInt與map遍歷組合題前端面試題
- 組合語言-基礎功能組合語言
- 【刷題1】LeetCode 39. 組合總和 java基礎LeetCodeJava
- java list最優遍歷Java
- [JAVA] xml遍歷輸出JavaXML
- Leetcode 590. N叉樹的後序遍歷(DAY 2)LeetCode
- 函式組合的 N 種模式函式模式
- 二叉樹的所有遍歷非遞迴實現二叉樹遞迴
- N個人,按M進行分組
- NX二次開發-建模-遍歷所有物件物件
- js的map遍歷和array遍歷JS
- python 元組,列表 迴圈遍歷Python
- 組合語言-基礎知識組合語言
- Pandas 基礎 (9) - 組合方法 merge
- java陣列如何遍歷全部的元素Java陣列
- Java遍歷Map物件的四種方式Java物件
- java中遍歷map的集中方法Java
- 玩轉二叉樹(樹的遍歷)二叉樹
- 二叉樹遍歷 -- JAVA二叉樹Java
- 從陣列中找出N個數,其和為M的所有可能陣列
- Java基礎 --- 綜合練習Java