注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号 
x
关于leetcode上DFS的一道题目,给一个K,一个N,找出1 - N的所有组合数,个数为K。这题是用DFS来解的,但是目前小弟写出两个DFS解法,我不知道这两个解法 到底是哪个更加好一点。直觉告诉我第一个分支更少,会比较好,但是运行下来 两个相差无几 甚至分之多的那个解法目测更加快一点,有点晕。。求教一下,这到底可以怎么分析?一般做题的时候 哪种更加符合思维呢?
第一个解法的意思就是可以选当前的元素,或者不选。所以两个分支。
第二个解法的意思就是选当前的元素,然后依次选下一个(不选之前的元素了)。所以分支挺多的。
解法附上:
public ArrayList<ArrayList<Integer>> combine(int n, int k) {
ArrayList<ArrayList<Integer>> coll = new ArrayList<ArrayList<Integer>>();
if(n > 0){
dfs(1, n, k, new ArrayList<Integer>(), coll);
}
return coll;
}
解法一:
public void dfs(int low, int high, int count, ArrayList<Integer> list ,ArrayList<ArrayList<Integer>> coll){
if(high - low + 1 < count){
return;
}
if(count == 0){
coll.add(new ArrayList<Integer>(list));
return;
}
// this element is not selected
dfs(low + 1, high, count, list, coll);
// this element is selected
list.add(low);
dfs(low + 1, high, count - 1, list, coll);
list.remove(list.size() - 1);
}
解法二:
public void dfs(int low, int high, int count, ArrayList<Integer> list ,ArrayList<ArrayList<Integer>> coll){
if(high - low + 1 < count){
return;
}
if(count == 0){
ArrayList<Integer> newList = new ArrayList<Integer>();
newList.addAll(list);
coll.add(newList);
}
for(int i = low; i <= high; i++){
list.add(i);
dfs(i + 1, high, count - 1, list, coll);
list.remove(list.size() - 1);
}
}
|