思路:
-
n为1234,即树的宽度;k为个数;即树的深度;
-
每一次递归函数都是一个for循环;
-
需要一个startIndex变量记录下一层for循环应该从哪里开始;
-
剪枝需要记住一个公式,n - ( k-path.size() ) + 1,其中括号内的内容为还需要几个数字才能满足k。
class Solution {
List<List<Integer>> result = new ArrayList<>();
LinkedList<Integer> path = new LinkedList<>();
public List<List<Integer>> combine(int n, int k) {
backTracker(n, k, 1);
return result;
}
private void backTracker(int n, int k, int startIndex){
if(path.size() == k){
result.add(new ArrayList<>(path));
return;
}
for(int i = startIndex; i<= n; i++){
path.add(i);
backTracker(n, k, i + 1);
path.removeLast();
}
}
}
References
https://github.com/youngyangyang04/leetcode-master/blob/master/problems/0077.%E7%BB%84%E5%90%88.md