给定两个整数 n
和 k
,返回范围 [1, n]
中所有可能的 k
个数的组合。
你可以按 任何顺序 返回答案。
示例 1:
输入:n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]
示例 2:
输入:n = 1, k = 1 输出:[[1]]
class Solution {
List<Integer> path = new LinkedList<>();
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> combine(int n, int k) {
backTracking(n,k,1);
return res;
}
public void backTracking(int n, int k, int startIndex){
if(path.size() == k){
res.add(new ArrayList<>(path));
}
for(int i = startIndex; i <= n; i++){
path.add(i);
backTracking(n , k , i + 1);
path.removeLast();
}
}
}
首先,定义了一个成员变量path
,用于存储当前正在生成的组合,res
用于存储最终的组合结果。
combine
方法是入口方法,接受两个整数参数n
和k
,表示从1到n的数字中选取k个数字进行组合,返回所有可能的组合结果。在该方法中,调用backTracking
方法进行回溯生成组合。
backTracking
方法是实际用于回溯生成组合的核心方法。首先,判断当前正在生成的组合path
的长度是否等于k,如果是,则表示已经生成了一个完整的组合,将其添加到结果res
中。
如果当前组合还不完整,那么从startIndex
开始遍历数字,将每个数字添加到path
中,并递归调用backTracking
方法,以生成下一个位置的数字。
在递归调用返回后,表示下一个位置的数字已经生成完毕,此时需要恢复状态。将最后添加到path
中的数字移除(path.removeLast()
),以便继续尝试其他数字的组合。
通过不断地递归调用和状态的恢复,可以生成所有可能的组合。
这段代码的思想也是基于回溯算法。回溯算法在组合问题中是一种常见的解决方法。通过递归函数和状态的维护,遍历所有可能的选择,生成符合条件的组合。在这个过程中,需要设置合适的参数来记录当前的状态,以及确定递归的边界条件。这段代码通过递归调用和状态的维护,生成了所有可能的数字组合,并将结果存储在res
中返回。