题目链接
思路:
组合的问题,以及排列的问题,都可以用回溯法解决,这种题目见多了也就知道怎么做了。
对于每一个数字,每一次都从这个数字往后找,找够k个数字,添加到最终的结果集合中
每一次添加完成之后,需要将当前组合中最后添加进来的数字移除掉,然后从这个数字后一个数字开始重新找
最终以每一个数字为开头寻找结束之后,返回结果
public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> ans = new ArrayList<>();
if (n <= 0 || k <= 0 || k > n) {
return ans;
}
// 当前从0开始,进行DFS深度优先搜索
dfs(n, k, 0, 0, new ArrayDeque<Integer>(), ans);
return ans;
}
/**
*
* @param n 题目给的n个数字
* @param k 题目给的组合数
* @param cur 当前数字
* @param depth 已经组合的数字的个数
* @param path 记录当前组合
* @param ans 记录最终答案
*/
private void dfs(int n, int k, int cur, int depth,
Deque<Integer> path, List<List<Integer>> ans) {
// 当已经组合的数字个数等于 k 时,需要将此结果加入到最终结果中
if (depth == k) {
ans.add(new ArrayList(path));
return;
}
// 由于从1开始,所以0位置不用
for (int i = cur + 1; i <= n; i++) {
// 将当前数字作为备选
path.push(i);
// 开始尝试下一个数
dfs(n, k, i, depth + 1, path, ans);
// 将当前数字从备选中移除
path.pop();
}
}