首页 > 其他 > 详细

DFS

时间:2018-01-01 00:09:58      阅读:235      评论:0      收藏:0      [点我收藏+]

这里总结了Leetcode中两道关于DFS的题

1. Combination Sum:https://leetcode.com/problems/combination-sum/#/description

按照例题的数据,假设给定的集合为{2,3,6,7},目标值是7。直观来看,它的搜索空间是一棵树,如下图

 技术分享图片

 树的每一层为减去集合中的元素后得到的结果,如,目标值分别减去2,3,6,7后,得到5,4,1,0,即为第一层的节点。当某一个节点的值为0时,表明从根节点到该节点的路径即为一个合法的结果。因此在编写程序时,应该保存路径,这里我使用了vector<int>& v。在编写DFS的递归代码时,应该将递归需要的变量全部以函数参数的形式传给函数,同时,递归调用往往在循环中发生,且一次递归调用仅表示一个层中的一个节点。代码如下:

void DFS(vector<vector<int>>& res, int idx, int sum, vector<int>& v,
    vector<int>& candidates, int target)
{
    if (sum == target) res.push_back(v);
    else if (sum<target)
    {
        for (int i = idx; i < candidates.size(); i++)
        {
            v.push_back(candidates[i]);
            DFS(res, i, candidates[i] + sum, v, candidates, target);
            // backtracking
            v.pop_back();
        }
    }
}

2. Generate Parentheses https://leetcode.com/problems/generate-parentheses/#/description

该题目的搜索空间如下:

 技术分享图片

每次应该保留的参数为左右括号的个数和目前的括号序列,因为右括号的个数不能大于左括号的个数,所以循环递归时的循环条件为while (right<left),此外,当左括号的个数等于了n,则应该不进入递归,所有进入递归的条件为if(left<n)。

代码如下:

void DFS(vector<string>& res, int n, int left, int right, string s)
{
    if (left == n&&left == right) { res.push_back(s); return; }
    if (left<n)
    {
        s += "(";
        left++;
        DFS(res, n, left, right, s);
        while (right<left)
        {
            s += ")";
            right++;
            DFS(res, n, left, right, s);
        }
    }
}

 

 

 

DFS

原文:https://www.cnblogs.com/wangguodong/p/8159341.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!