代码
class Solution { List< List<Integer> > result = new ArrayList<>(); LinkedList<Integer> path = new LinkedList<>(); public List<List<Integer>> combine(int n, int k) { backtracking(n,k,1); return result; } /** * n 元素总个数 * k k个元素一组 * startIndex 这个参数⽤来记录本层递归的中,集合从哪⾥开始遍历 */ public void backtracking(int n, int k, int startIndex) { int size = path.size(); if(size == k) { result.add(new ArrayList<>(path)); return ; } //剪枝操作 //在集合n中⾄多要从该起始位置 : n - (k - path.size()) + 1,开始遍历 //为什么有个+1呢,因为包括起始位置,我们要是⼀个左闭的集合 for(int i = startIndex; i <= n - ( k - size ) + 1; i++ ) { path.add(i); backtracking(n,k,i+1); path.removeLast(); } }}