1、递推思想
打印输出从自然数1,2,3, ... , n中任取r个数的所有组合。
递归的思想,公式:
代码实现:
public class Test{
public static int tol = 5;
public static int num = 3;
public static int a[] = new int[num];
public static void com(int n, int r){
for(int i=n; i>=r; i--){
a[r-1] = i;
if(r == 1){
printArray(a);
}else{
com(i-1, r-1);
}
}
}
public static void printArray(int[] a){
for(int i=0; i<a.length; i++){
System.out.printf("%-2d", a[i]);
}
System.out.println();
}
public static void main(String[] args){
com(tol, num);
}
}
输出结果:
3 4 5
2 4 5
1 4 5
2 3 5
1 3 5
1 2 5
2 3 4
1 3 4
1 2 4
1 2 3
2、力扣#77题解答
public static class Solution2 {
private List<List<Integer>> ans;
private Integer[] buffer;
public List<List<Integer>> combine(int n, int k) {
ans = new ArrayList<>(128);
//从n个数中选k个,k>n肯定不可能完成
if(k>n)return ans;
buffer = new Integer[k];
dfs(n, k);
return ans;
}
// 从1..n中选k个,
// k...n都有可能是一组解中的最后一个元素
private void dfs(int n, int k){
for(int i=n; i>=k; i--){
//填写“最后”一个元素
buffer[k-1] = i;
if(k == 1){
//已经填充到了第一个元素,收集答案
List<Integer> list = new ArrayList<>(buffer.length);
for (int j = 0; j < buffer.length; j++) {
list.add(buffer[j]);
}
ans.add(list);
} else{
//调用子问题,选定最后一个元素后,从剩下的前面i-1个元素中再选k-1个即可
dfs(i-1, k-1);
}
}
}
}