有人能告诉我为什么这段代码使用DFS?

时间:2016-06-06 03:02:42

标签: depth-first-search

我知道如果我们处理图DFS,我们使用堆栈来跟踪访问的节点。但是下面的代码也使用DFS。我读了几遍,但仍然无法弄清楚它在哪里DFS.Thanks!

 public ArrayList<ArrayList<Integer>> combinationSum(int[] candidates, int target) {  
     ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();  
     ArrayList<Integer> item = new ArrayList<Integer>();
     if(candidates == null || candidates.length==0)  
         return res; 

     Arrays.sort(candidates);  
     helper(candidates,target, 0, item ,res);  
     return res;  
 }  

 private void helper(int[] candidates, int target, int start, ArrayList<Integer> item,   
 ArrayList<ArrayList<Integer>> res){  
     if(target<0)  
         return;  
     if(target==0){  
         res.add(new ArrayList<Integer>(item));  
         return;  
     }

     for(int i=start;i<candidates.length;i++){  
         if(i>0 && candidates[i] == candidates[i-1])
         item.add(candidates[i]);
         int newtarget = target - candidates[i];
         helper(candidates,newtarget,i,item,res);
         item.remove(item.size()-1);  
     }  
 } 

1 个答案:

答案 0 :(得分:2)

DFS 可以使用两种基本技术实现:

<强> 1 即可。使用堆栈

<强> 2 即可。使用递归。

我知道您很难相信您提供的代码使用的是DFS,因为您无法在任何地方看到显式堆栈。原因是因为它使用第二种技术实现了DFS

第二种技术也很容易实现。它的伪代码非常简单。

DFS( vertex v )
{
 mark v visited
 for all unvisited vertices u adjacent to v
 {
    DFS(u)
 }
}

您提供的代码仅使用这种简单的技术,但如果您已经学习过课程操作系统,您将会发现递归使用程序堆栈来跟踪函数调用,因此您间接仍在使用堆栈,但这是一个不同的问题。