我知道如果我们处理图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);
}
}
答案 0 :(得分:2)
DFS 可以使用两种基本技术实现:
<强> 1 即可。使用堆栈
<强> 2 即可。使用递归。
我知道您很难相信您提供的代码使用的是DFS
,因为您无法在任何地方看到显式堆栈。原因是因为它使用第二种技术实现了DFS 。
第二种技术也很容易实现。它的伪代码非常简单。
DFS( vertex v )
{
mark v visited
for all unvisited vertices u adjacent to v
{
DFS(u)
}
}
您提供的代码仅使用这种简单的技术,但如果您已经学习过课程操作系统,您将会发现递归使用程序堆栈来跟踪函数调用,因此您间接仍在使用堆栈,但这是一个不同的问题。