题目:给定两个数n,k 从1到n这n个数中选择k个组成一个组合(不能重复)
例如 n=4,k=2 则相应的组合有[[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]]
- 思路:显然这种类型的题目都需要用回溯法来做。找到结束条件至关重要,对于此题 当 k < 0或者n-start + 1 < k的时候需要结束本次递归,当k=0的时候,说明这一个解已经找到(将解加入到列表里)
- 难度:Medium
- 代码:
public class Solution {
public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> result = new ArrayList<>();
if(k == 0){
return result;
}
if(n < k){
return result;
}
backtrack(result, new ArrayList<>(), n, k,1);
return result;
}
private void backtrack(List<List<Integer>> result, List<Integer> list, int n, int k, int start){
if(k < 0 || n-start < k-1){
return;
}else if(k == 0){
result.add(new ArrayList<>(list));
}else{
for(int i = start; i <= n; i++){
list.add(i);
backtrack(result, list, n, k-1, i+1);//下一次的start是数组的下一个值
list.remove(list.size()-1);//回退到上一步
}
}
}
}