leetcode DFS专题

news/2024/7/20 20:01:04 标签: 深度优先, 算法

1 DFS 框架

result = []
void backtrack(路径,选择列表) {
    if (满足条件) {
        result.add(路劲);
        return;
    }
    for 选择 in 选择列表
        做选择
        backtrack(路径,选择列表);
        撤销选择
}

相关题目:

112 路径总和

class Solution {
public:
    vector<int> path;
    vector<int> res;
    void dfs(TreeNode* root) {
        if (root == nullptr) {
            return;
        }
        if (root->left == nullptr && root->right == nullptr) {
            res.push_back(accumulate(path.begin(), path.end(), root->val));
            return;
        }
        path.push_back(root->val); //注意添加路径应放到return 后面,保证push / pop 是配对的
        dfs(root->left);
        dfs(root->right);
        path.pop_back(); //删除vector 最后一个元素
    }
    bool hasPathSum(TreeNode* root, int targetSum) {
        dfs(root);
        for (auto item : res) {
            if (item == targetSum) {
                return true;
            }
        }
        return false;
    }
};

129 求根节点到叶子节点之和 

class Solution {
    StringBuilder path = new StringBuilder();
    int res = 0;

    public int sumNumbers(TreeNode root) {
        // 遍历一遍二叉树就能出结果
        traverse(root);
        return res;
    }

    // 二叉树遍历函数
    void traverse(TreeNode root) {
        if (root == null) {
            return;
        }
        // 前序遍历位置,记录节点值
        path.append(root.val);
        if (root.left == null && root.right == null) {
            // 到达叶子节点,累加路径和
            res += Integer.parseInt(path.toString());
        }
        // 二叉树递归框架,遍历左右子树
        traverse(root.left);
        traverse(root.right);

        // 后续遍历位置,撤销节点值
        path.deleteCharAt(path.length() - 1);

    }
}

46 全排列 

class Solution {
public:
    vector<vector<int>> res;
    vector<int> path;
    void dfs(vector<int>& nums, int n) { //n为已添加到path 的个数
        if (n == nums.size()) {
            res.push_back(path);
            return;
        }
        for (int i = 0; i < nums.size(); i++) {
            if (count(path.begin(), path.end(), nums[i])) { //利用count 将重复数删除
                continue;
            }
            path.push_back(nums[i]);
            dfs(nums, n + 1);
            path.pop_back();
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        dfs(nums, 0);
        return res;
    }
};

回溯算法团灭子集/组合/排列问题

 

子集/组合/排列递归树 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6ZmM5LiK54Of6Zuo6YGlNDA3,size_20,color_FFFFFF,t_70,g_se,x_16

关键代码实现

子集/组合 用start控制重复数字的出现
for (int i = start; i < n; i++) {
    .....
}

排列用count来控制重复数字出现
for (int i = 0; i < n; i++) {
    if (count(begin(), end(), val)) {
        continue;
    }
    ......
}

 

 


http://www.niftyadmin.cn/n/791777.html

相关文章

leetcode BFS框架

BFS框架 当涉及求二叉树层级值时&#xff0c;就考虑用广度优先搜素; queue<item> myQueue; while (!queue.empty()){sz queue.size();for (int i 0; i < sz; i) {myQueue.front(), myQueue.pop();.......if (condition) {myQueue.push();}.......} } 102 二叉树的…

leetcode 算法小技巧

1 备忘录 可以用一维数组或者哈希表充当备忘录。 int fib(int N) { // 备忘录全初始化为 0 int[] memo new int[N 1]; // 进行带备忘录的递归 return helper(memo, N);}int helper(int[] memo, int n) { // base case if (n 0 || n 1) return n; //…

leetcode动态规划

动态归化&#xff1a; 应用场景&#xff1a;一旦涉及子序列和最值一般用动归。 解题步骤&#xff1a;确定base case(动归base case就是dp数组的初始值)&#xff0c;确定状态转移方程,将dp数组一个个推导出来。 dp数组定义的两种形式&#xff1a;一维dp(单串字符)&#xff0c;二…

leetcode 树

1 求树的高度&#xff1a;转化为求以root为根的左右子树最大高度加一就是树的高度。 1 max(treeHeight(root->left), treeHeight(root->right)); 110 平衡树&#xff1a;先求左右子树高度&#xff0c;相减就能得出结果。​​​​​https://leetcode-cn.com/problems/b…

leetcode数组

1 两数之和&#xff1a;利用unordered_map<>节点的值和下标&#xff0c;当diff target - nums[i];如果diff存在于map中&#xff0c;则{i,map(diff)} 则为结果。 15 三数之和&#xff0c;18 四数之和&#xff1a;可以转化为通用nSum&#xff0c;nSum num(i) (n-1)Sum;…

leetcode题型分析

1) 前缀和 1 应用场景: 需频繁的对某一区间进行求和 2 算法思想&#xff1a;用prevSum[i 1] 记录nums[0...i]之和&#xff0c;要求nums[i..j] 之间的和只需 prevSum[j1] - prevSum[i]就好。 3 表达式&#xff1a;prevSum[i1] nums[0] nums[1] ... nums[i]; nums[i..j] …

仿QQ slidingmenu 自定义属性 自定义控件

自定义属性 1.书写自定义属性xml values\attr.xml 2.在布局文件中使用 亲测 xmlns:ali:http:schemas.android.com/apk/res-auto 3.在构造函数中&#xff08;3个参数&#xff09;获取我们定义的值 自定义控件 onlayout 决定子View的放置的位置 onmeasure 决定子view和本身…

leetcode题型分析《图》

图 1)图的搜索 剑指offer II 105:最大岛屿面积 1 基于队列广度优先搜索解题 step1 找出图的节点和边&#xff0c;将为1的岛屿视为图的节点&#xff0c;上下左右相邻格子为1的节点之间有条边。 step 2 逐一扫描每一个节点&#xff0c;当遇到节点为1&#xff0c;且不在已知岛…