Leetcode 剑指 Offer II 050. 路径总和 III

news2024/11/15 20:26:33

题目难度: 中等

原题链接

今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~

题目描述

给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。

路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

示例 1:

  • 输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8
  • 输出:3
  • 解释:和等于 8 的路径有 3 条,如图所示。

示例 2:

  • 输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
  • 输出:3

提示:

  • 二叉树的节点个数的范围是 [0,1000]
  • -10^9 <= Node.val <= 10^9
  • -1000 <= targetSum <= 1000

题目思考

  1. 如何快速计算任意路径的和?
  2. 如何快速得到指定和的路径数目?

解决方案

思路
  • 要想得到任意从上到下的路径的和, 很容易想到类似数组前缀和的做法
    • 例如对于上述示例, 要想得到最右侧 4->1 的路径和, 我们可以通过计算根节点到节点 1 和节点 8 的前缀和差值来得到: sum(5->8->4->1) - sum(5->8)
  • 通过这样预处理, 我们可以得到任意从上到下路径的和, 那如何快速得到指定和的路径数目呢?
    • 我们可以额外引入一个计数字典 sumCnt, 来统计当前路径已经遍历过的所有节点的前缀和的计数, 注意初始化sumCnt[0] = 1, 代表路径没有任何节点的情况
    • 在遍历当前节点时, 假设其前缀和为 curSum, 目标路径和为 targetSum, 那么以当前节点为终点的所有路径中, 路径和为 targetSum 的路径数目即为 sumCnt[curSum - targetSum], 累加所有节点的这一数目, 就得到了最终结果
  • 下面代码中有详细的注释, 方便大家理解
复杂度
  • 时间复杂度 O(N): 每个节点只会被遍历一次
  • 空间复杂度 O(logN): 递归调用最多使用 O(logN) 栈空间, 而前缀和计数字典也会存当前路径上的节点, 这部分也是 O(logN)
代码
class Solution:
    def pathSum(self, root: TreeNode, targetSum: int) -> int:
        # 递归+前缀和计数字典
        # sumCnt是前缀和计数字典{curSum:cnt}, 统计当前路径上前缀和是curSum的路径数目cnt
        sumCnt = collections.defaultdict(int)
        # 显然刚开始时就存在前缀和是0的一种情况, 即空路径
        sumCnt[0] = 1
        # res记录最终满足条件的路径数目
        res = 0

        def dfs(node, curSum):
            nonlocal res
            if not node:
                # 当前节点为空, 返回
                return
            # 更新当前前缀和
            curSum += node.val
            # 以当前节点为终点的满足条件的路径数目为sumCnt[curSum - targetSum], 累加到最终结果中
            res += sumCnt[curSum - targetSum]
            # 当前前缀和计数+1, 在遍历子树中可以被用到
            sumCnt[curSum] += 1
            # 继续递归左右子树
            dfs(node.left, curSum)
            dfs(node.right, curSum)
            # 最后恢复现场, 因为退出当前递归函数后, 当前节点就不在路径上了, 所以其计数要-1
            sumCnt[curSum] -= 1

        dfs(root, 0)
        return res

大家可以在下面这些地方找到我~😊

我的 GitHub

我的 Leetcode

我的 CSDN

我的知乎专栏

我的头条号

我的牛客网博客

我的公众号: 算法精选, 欢迎大家扫码关注~😊

算法精选 - 微信扫一扫关注我

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1143156.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大厂面试题-什么是内存溢出,什么是内存泄漏?

目录 1、什么是内存溢出&#xff1f; 2、什么是内存泄漏&#xff1f; 3、如何避免&#xff1f; 1、什么是内存溢出&#xff1f; 我们来看到右侧的区域&#xff0c;假设我们JVM中可用的内存空间只剩下3M&#xff0c;但是我们要创建一个5M的对象&#xff0c;那么&#xff0c;…

前端JS for循环内异步接口变成同步提交(JavaScript for循环异步变同步)

遇见的问题&#xff1a; 导入Excel文件的时候&#xff0c;将每行数据整合成一个数组&#xff0c;循环数组插入每一条数据&#xff0c;插入数据后要判断是否插入成功&#xff0c;如果没插入成功的话&#xff0c;停止循环&#xff0c;不再插入后面的数据。甚至插入数据后&#xf…

【Leetcode】反转单链表

反转单链表 反转单链表题目题目思路代码 反转单链表题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 题目思路 链表的本质就是改变每一个结点的next域。 我们从第一个结点开始遍历&#xff0c;改变它的next域。 当我们要注意在改变…

尚未解决:use_python()和use_virtualenv()的使用

reticulate包为Python和R之间的互操作性提供了一套全面的工具。该包包含以下功能&#xff1a; 以多种方式从R调用Python&#xff0c;包括RMarkdown、获取Python脚本、导入Python模块以及在R会话中交互使用Python。 R和Python对象之间的转换&#xff08;例如&#xff0c;R和Pan…

TP项目启用websocket聊天功能 - gateway、wss、swoole、长连接 - PHP

TP项目启用websocket聊天功能 须知 swoole不支持windows安装,没有windows扩展WebSocket 在线测试(可测本地wss连接) websocket在线测试建议gateway只负责给终端发信,不参与逻辑部分后台负责所有的收信+发信安排,可以方便地获取用户好友关系、上下线状态管理、消息缓存、已…

图文并茂的帮助文档你值得拥有

概述 工作中除了写代码开发需求&#xff0c;也需要写文档&#xff0c;怎么写好一个文档能够让读者既能看懂API&#xff0c;又能快速上述操作&#xff0c;所见即所得。本文基于vitepress、ace-builds带大家实现一个这样好用的帮助文档。 实现效果 在线预览地址&#xff1a;ht…

4.5 数据加密

思维导图&#xff1a; 4.5 数据加密 为确保高度敏感数据的安全性&#xff0c;如财务、军事及国家机密数据&#xff0c;可采用数据加密技术。此技术将原始数据&#xff08;明文&#xff09;转化为不可识别格式&#xff08;密文&#xff09;&#xff0c;确保不知解密方法的人无法…

提高车联远控异常分析效率的设想

提高车联远控异常分析效率的设想 前言 随着汽车集成度、智能化、软件功能越来越丰富&#xff0c;用户车辆使用已不是传统的出行、驾驶等物理场景&#xff0c;更多的人与车的互动功能的场景。其中车联远控功能使用日益增多。技术人员开展排查车联远控问题时&#xff0c;往往需…

图解kd树+Python实现

开篇 在讲解k-近邻算法的时候&#xff0c;我们提供的思路是&#xff1a;对于新到来的样本&#xff0c;计算该样本与训练集中所有样本之间的距离&#xff0c;选取训练集中距离新样本最近的k个样本中大多数样本的类别作为新的样本的类别。 也就是说&#xff0c;每次都要计算新的样…

c语言基础:L1-060 心理阴影面积

这是一幅心理阴影面积图。我们都以为自己可以匀速前进&#xff08;图中蓝色直线&#xff09;&#xff0c;而拖延症晚期的我们往往执行的是最后时刻的疯狂赶工&#xff08;图中的红色折线&#xff09;。由红、蓝线围出的面积&#xff0c;就是我们在做作业时的心理阴影面积。 现给…

4.6 其他安全性保护

思维导图&#xff1a; 4.6 其他安全性保护 1. 推理控制 (Inference Control) 定义&#xff1a;处理强制存取控制未解决的问题&#xff0c;如利用列的函数依赖关系&#xff0c;从低安全等级信息推导出高安全等级信息。示例&#xff1a;在公司信息系统中&#xff0c;姓名和职务为…

SQL查询优化---如何查询截取分析

慢查询日志 1、慢查询日志是什么 MySQL的慢查询日志是MySQL提供的一种日志记录&#xff0c;它用来记录在MySQL中响应时间超过阀值的语句&#xff0c;具体指运行时间超过long_query_time值的SQL&#xff0c;则会被记录到慢查询日志中。 具体指运行时间超过long_query_time值的…

use renv with this project create a git repository

目录 1-create a git repository 2-Use renv with this project 今天在使用Rstudio过程中&#xff0c;发现有下面两个新选项&#xff08;1&#xff09;create a git repository (2) Use renv with this project. 选中这两个选项后&#xff0c;创建新项目&#xff0c;在项目目…

Redis(01)| 数据结构

这里写自定义目录标题 Redis 速度快的原因除了它是内存数据库&#xff0c;使得所有的操作都在内存上进行之外&#xff0c;还有一个重要因素&#xff0c;它实现的数据结构&#xff0c;使得我们对数据进行增删查改操作时&#xff0c;Redis 能高效的处理。 因此&#xff0c;这次我…

此页面不能正确地重定向

这种是由于条件判断有误&#xff0c;程序不断的重定向到一个页面&#xff0c;而造成的死循环的情况 下面列举一个常出现的场景之一 1、使用过滤器实现登录验证错误处理 解释&#xff1a;当用户访问login.jsp进行登录的时候&#xff0c;这个时候请求会被Filter捕获&#xff0…

【Java基础(高级篇)】集合源码剖析

集合源码剖析 文章目录 集合源码剖析1. List接口分析1.1 ArrayList1.2 LinkedList 2. Map接口分析2.1 哈希表的物理结构2.2 HashMap中数据添加过程2.2.1 JDK7中过程分析2.2.2 JDK8中过程分析 2.3 红黑树2.4 HashMap源码剖析(JDK1.8.0_271)2.4.1 Node2.4.2 属性2.4.3 构造器2.4.…

基础课11——数据来源

随着科技的进步和数字化转型的加速&#xff0c;全球数据量正以惊人的速度增长。根据IDC的最新报告&#xff0c;2020年全球数据总量已经达到了约53 ZB&#xff08;Zettabyte&#xff0c;万亿亿GB&#xff09;&#xff0c;而这个数字在2025年预计会达到175 ZB。这种指数级增长不仅…

MAC下安装Python

MAC基本信息&#xff1a; 执行命令&#xff1a; brew install cmake protobuf rust python3.10 git wget 遇到以下问题&#xff1a; > Downloading https://mirrors.aliyun.com/homebrew/homebrew-bottles/rust-1.59.0 Already downloaded: /Users/xxxx/Library/Caches/Ho…

售后处置跟踪系统设想

售后处置跟踪系统设想 前言 随着汽车工业的发展&#xff0c;软件定义车的模式已成为主流汽车设计及智能化功能架构模式&#xff0c;通过引入SOA的软件架构设计&#xff0c;使得现有的座舱软件、云端服务软件、App软件等众多功能模块的版本迭代频次日新月异&#xff0c;发版更…