题目描述:给定两个整数 n
和 k
,返回范围 [1, n]
中所有可能的 k
个数的组合。
你可以按 任何顺序 返回答案。
解题思路:首先定义两个全局变量result和path,其中path中存放的是每次递归时符合元素的集合,result中存放的时所有符合要求的path的集合。
①确定递归函数的类型和参数:递归函数的类型可以设置为void,参数为原本集合数组的大小,与待分组的集合的大小。
②确定终止条件:当path集合的大小等于k的时候条件终止
③确定单层逻辑:从左至右循环遍历,运用剪枝操作将不可能的集合限制出去,然后添加符合条件的元素,逐层递归,之后再将元素pop出去
class Solution {
List<List<Integer>> result = new ArrayList<>();
LinkedList<Integer> path = new LinkedList<>();
public List<List<Integer>> combine(int n, int k) {
combinehelper(n,k,1);
return result;
}
private void combinehelper(int n,int k,int indexstart){
if(path.size() == k){
result.add(new ArrayList<>(path));
return;
}
for(int i = indexstart; i <= n - (k - path.size())+1;i++){
path.add(i);
combinehelper(n,k,i+1);
path.removeLast();
}
}
}