主题思想: : 有序数组,组合, 1…. n 可以抽象为一个有序数组, 题目大意就是从n个元素挑出k个的所有组合。
AC 代码: 代码中需要注意的一点就是,java是依靠引用的,在ans.add()时,必须新建list 对象,否则在执行完 dfs 会执行,tmp.remove() 这时,会清楚已经加入到ans的list ,导致ans 结果变成[[],[],[],[],...]
就是因为
for(int i=now+1;i<=n-k+step+1;i++){
tmp.add(i);
dfs(tmp,ans,i,step+1,k,n);
tmp.remove(tmp.size()-1); // here
}
中 tmp执行了remove() 方法,修改了ans中元素
所以必须用 ans.add(new ArrayList<Integer>(tmp));而不是 ans.add(tmp);
重点知识点是,java函数参数不存在像c++那样,可以直接改变,返回,就是说函数参数无法返回,,但是却可以改变对象里面的值
class Solution {
public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> ans=new ArrayList<List<Integer>>();
if(n<k) return ans;
dfs(new ArrayList<Integer> (),ans,0,0,k,n);
return ans;
}
public void dfs(List<Integer> tmp,List<List<Integer>> ans,int now ,int step, int k,int n){
if(step==k){
// notice this can not use ans.add(tmp) ;
// this must create a new array list , otherwise, after dfs, tmp will remove the obj,that added to ans ,so ans will be null like this[[],[],]
ans.add(new ArrayList<Integer>(tmp));
return ;
}
for(int i=now+1;i<=n-k+step+1;i++){
tmp.add(i);
dfs(tmp,ans,i,step+1,k,n);
tmp.remove(tmp.size()-1); // here
}
return ;
}
}