77.组合
给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
LeetCode
https://leetcode-cn.com/problems/combinations/
List<List<Integer>> ans = new ArrayList<>();
public List<List<Integer>> combine(int n, int k) {
if(n <= 0 || k <= 0) return ans;
dfs1(n,k,1,new ArrayList<>());
// dfs2(n,k,new ArrayList<>(),0);
return ans;
}
//算法一:index为所选数的下标[1,n+1]
private void dfs1(int n,int k,int index,List<Integer> list){
if(list.size() >= k){
ans.add(new ArrayList<>(list));
return;
}
if(index > n) return;
list.add(index);
dfs1(n,k,index+1,list);
list.remove(list.size()-1);
dfs1(n,k,index+1,list);
}
//算法二:以k计数,表示剩余可选择的个数[0,k]
private void dfs2(int n,int k,List<Integer> list,int pre){
if(k == 0){
ans.add(new ArrayList<>(list));
return;
}
for(int i = pre+1;i <= n-k+1;i++){ // i <= n-k+1 剪枝,可以大幅度提高时间复杂度
list.add(i);
dfs2(n,k-1,list,i);
list.remove(list.size()-1);
}
}