用递归写的,使用时要注意栈空间问题
/** * 从m个里取n个的所有组合 c(m,n) * * @param m * @param n * @return */ public static List<List<Integer>> getCombinationList(int m, int n) { if (n == 1) { List<List<Integer>> resultList = new ArrayList<List<Integer>>(); for (int i = 1; i <= m; i++) { resultList.add(new ArrayList<Integer>(Arrays.asList(i))); } return resultList; } List<List<Integer>> nMinusOneCombList = getCombinationList(m, n - 1); List<List<Integer>> resultList = new ArrayList<List<Integer>>(); for (List<Integer> nMinusOneComb : nMinusOneCombList) { for (int number = 1; number <= m; number++) { List<Integer> comb = new ArrayList<Integer>(); comb.addAll(nMinusOneComb); Integer maxOfNminusOneComb = nMinusOneComb.get(nMinusOneComb.size() - 1); if (number <= maxOfNminusOneComb) { continue; } comb.add(number); resultList.add(comb); } } return resultList; } public static void main(String[] args) { List<List<Integer>> resultList = getCombinationList(4, 2); for (List<Integer> list : resultList) { System.out.println(list); } }
执行main后输出:
[1, 2]
[1, 3]
[1, 4]
[2, 3]
[2, 4]
[3, 4]