LeetCode 113—— 路径总和 II

server/2024/10/18 18:16:04/

阅读目录

    • 1. 题目
    • 2. 解题思路
    • 3. 代码实现

1. 题目

2. 解题思路

看到树的问题一般我们先考虑一下是否能用递归来做。

假设 root 节点的值为 value,如果根节点的左子树有一个路径总和等于 targetSum - value,那么只需要将根节点的值插入到这个路径列表中作为第一个元素即可。同理,右子树也是一样。

最后,我们只需要特别处理一下边界条件即可:

  • 如果树是空的,那么直接返回一个空的列表。

  • 如果到达了叶子结点,而且叶子结点的值等于 targetSum,那么就返回一个包含叶子结点值的列表。

3. 代码实现

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<vector<int>> pathSum(TreeNode* root, int targetSum) {vector<vector<int> > ret;if (root == nullptr) {return ret;}if (root->left == nullptr && root->right == nullptr && root->val == targetSum) {vector<int> a(1, targetSum);ret.push_back(a);return ret;}vector<vector<int> > left_res = pathSum(root->left, targetSum-root->val);vector<vector<int> > right_res = pathSum(root->right, targetSum-root->val);for (size_t i = 0; i < left_res.size(); ++i) {left_res[i].insert(left_res[i].begin(), root->val);ret.push_back(left_res[i]);}for (size_t i = 0; i < right_res.size(); ++i) {right_res[i].insert(right_res[i].begin(), root->val);ret.push_back(right_res[i]);}return ret;}
};

上面代码的实现思路比较好理解,但是 insert 比较耗时,能不能直接 push_back 呢?

我们定义一个 path,访问到某一个节点后,就把这个节点的值添加到 path 中去,然后再分别递归调用左子树和右子树,只不过我们这里传入一个 path 的引用,当访问到叶子结点并且叶子结点的值刚好等于 targetSum,这时候的 path 刚好是一个满足条件的路径,我们把它放入到结果中去。

然后,把当前节点的值 pop_back 出去,回到上一级节点继续搜索其它路径。

class Solution {
public:vector<vector<int> > ret;void dfs(TreeNode* root, int targetSum, vector<int>& path) {if (root == nullptr) {return;}path.emplace_back(root->val);if (root->left == nullptr && root->right == nullptr && root->val == targetSum) {ret.emplace_back(path);}dfs(root->left, targetSum-root->val, path);dfs(root->right, targetSum-root->val, path);path.pop_back();}vector<vector<int>> pathSum(TreeNode* root, int targetSum) {vector<int> path;dfs(root, targetSum, path);return ret;}
};

http://www.ppmy.cn/server/2889.html

相关文章

【设计模式】4、prototype 原型模式

四、prototype 原型模式 https://refactoringguru.cn/design-patterns/prototype 如果希望 复制对象, 可使用 “prototype 模式” 如果 “待复制的对象” 是 interface 而不是 class, 或者如果 class 有 private 变量时. 无法知道 "待复制的对象"的细节, 则需要其…

【Linux】文件描述符——万字详解

目录​​​​​​​ 前言 预备知识 复习C语言的文件接口 写方式打开文件 追加方式打开文件 读方式打开文件 系统的文件接口 open close write read 文件描述符 0 & 1 & 2 理解文件描述符 文件描述符的分配规则 重定向的本质 dup2 理解Linux下一切…

恒峰智慧科技-森林消防便捷泵:轻松应对火灾危机!

在广袤无垠的森林中&#xff0c;绿色是生命的象征&#xff0c;是自然的馈赠。然而&#xff0c;当火魔无情地吞噬这片生命的绿洲时&#xff0c;我们需要一种快速、高效、可靠的消防工具来守护这片绿色。此时&#xff0c;森林消防便捷泵应运而生&#xff0c;成为了守护森林安全的…

前端框架模板

前端框架模板 1、vue-element-admin vue-element-admin是基于element-ui 的一套后台管理系统集成方案。 **功能&#xff1a;**https://panjiachen.github.io/vue-element-admin-site/zh/guide/#功能 **GitHub地址&#xff1a;**GitHub - PanJiaChen/vue-element-admin: :t…

Redis限流插件

Redis限流插件: 1:搭建层级结构 同时对 redis.log 授权 chmod 777 redis.log2:确认 redis 版本 3:下载redis配置文件 redis.conf https://redis.io/docs/management/config/ 4:上传/redis/conf作为原始 redis.conf 5:在/redis_6390/conf下编辑redis.conf docker run -it \ --…

使用React Context的一些优化建议

React Context 是一个强大的特性&#xff0c;允许你在组件树中共享数据&#xff0c;而无需手动逐层传递 props。然而&#xff0c;如果不正确地使用&#xff0c;它也可能导致不必要的重新渲染和性能问题。以下是一些使用 React Context 的优化建议&#xff1a; 分割 Context 不要…

ElasticSearch中使用bge-large-zh-v1.5进行向量检索(一)

一、准备 系统&#xff1a;MacOS 14.3.1 ElasticSearch&#xff1a;8.13.2 Kibana&#xff1a;8.13.2 BGE是一个常见的文本转向量的模型&#xff0c;在很多大模型RAG应用中常常能见到&#xff0c;但是ElasticSearch中默认没有。BGE模型有很多版本&#xff0c;本次采用的是bg…

【创建型模式】抽象工厂模式

一、抽象工厂模式概述 抽象工厂模式定义&#xff1a;提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无须指定它们具体的类。 模式动机&#xff1a; 1.当系统提供的工厂生产的具体产品并不是一个简单的对象&#xff0c;而是多个位于不同产品等级结构、属于不同类型的…