国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

java基礎:遍歷m取n的所有組合

2019-11-18 15:20:16
字體:
來源:轉載
供稿:網友
     /**
  * <PRe>
  * 求m取n的所有組合。
  * m個數分別為0,1,2...m-1.
  * 算法簡述:
  *   二個組合,若僅有元素順序不同,視其為同一個組合。
  *   左位系低位,右位系高位。
  *   按自然的取法取第一個組合(各數位分別是:0,1,2...n-1),以后的所有組合都經上一個組合變化而來:
  *   從右至左,找到有增量空間的位,將其加1,使高于該位的所有位,均比其左鄰位大1,從而形成新的組合。
  *   若所有位均無增量空間,說明所有組合均已被遍歷。
  *   使用該方法所生成的組合數中:對任意組合int[] c,下標小的數必定小于下標大的數.
  * </pre>
  */
 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] = 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;
  }
 }


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 合阳县| 安陆市| 商丘市| 永康市| 汽车| 泉州市| 元江| 布拖县| 措勤县| 庄浪县| 永吉县| 武邑县| 墨玉县| 乳山市| 岳池县| 洪泽县| 阿克苏市| 田阳县| 同德县| 枝江市| 疏附县| 城步| 锡林郭勒盟| 贵德县| 武威市| 溧水县| 裕民县| 乌拉特前旗| 报价| 长丰县| 襄垣县| 光山县| 蓝田县| 四平市| 蒙阴县| 天气| 沙坪坝区| 云龙县| 固阳县| 漳州市| 柘城县|