题目描述
给定数组int[] A = {1,2,3,4.....n},打印出它的所有组合。即对m >= 1 && m <=n,从A中任取i个数并成一组的集合的并。
例如:m = 2时,从A中得到的集合为12,13,1n.........23,24,25.........(n-1)n
解题思路
看到题目我们就可以联想到使用递归来解决。我们可以将从A中取出i个数化为以下几步:
- 从A中取出第一个字符,从余下的n-1个字符中再选取m-1个字符,求它的组合;
- 不使用A的第一个字符,从余下的n-1个字符中再选取m个字符,求它的组合;
这两个问题均为递归问题。
注:开始时我总想通过for循环来控制那些元素选过还是没选过,再回溯求解,但发现涉及的记录状态太多,回溯时总是出错,走上了歧路。
代码
对m >= 1 && m <=n,分别求其组合
int[] A = { 1, 2, 3 };
for (int i = 1; i <= A.length; i++) {
ArrayList<Integer> result = new ArrayList<Integer>();
getCombination(A, i, 0, result);
}
public static void getCombination(int[] A, int m, int start,
ArrayList<Integer> result) {
if (m == 0) {
//当m个元素已经获取完,则打印
for (Integer i : result) {
System.out.print(i + " ");
}
System.out.println("");
return;
}
if (start < A.length) {
//从A中取出A[start],从余下的(n-start)-1个字符中再选取m-1个字符,求它的组合;
result.add(A[start]);
getCombination(A, m - 1, start + 1, result);
//不使用A[start],从余下的(n-start)-1个字符中再选取m个字符,求它的组合;
result.remove(result.size() - 1);
getCombination(A, m, start + 1, result);
}
return;
}