LeetCode437:路径总和III

2023-05-16

要求

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

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

在这里插入图片描述

思路

前缀和:该节点到根之间的路径和,也就是说到达当前元素的路径上,之前所有元素的和。
节点8的前缀和:1 + 2 + 4 + 8 = 15
节点9的前缀和:1 + 2 + 5 + 9 = 17

  	 1
 	/  \
   2    3
  / \    \
 4   5    6
/ \   \
7  8   9

题目要求的是找出路径和等于给定数值的路径总数, 而:两节点间的路径和 = 两节点的前缀和之差

                 1
                / 
               2    
              / 
             3   
            / 
           4

假如题目给定数值为5

节点1的前缀和为: 1
节点3的前缀和为: 1 + 2 + 3 = 6
prefix(3) - prefix(1) == 5
所以 节点1 到 节点3 之间有一条符合要求的路径( 2 --> 3 )



HashMap存的是什么?
HashMap的key是前缀和, value是该前缀和的节点数量,记录数量是因为有出现复数路径的可能。

恢复状态的意义
由于题目要求:路径方向必须是向下的(只能从父节点到子节点)
当我们把一个节点的前缀和信息更新到map里时,它应当只对其子节点们有效。
状态恢复代码的作用就是: 在遍历完一个节点的所有子节点后,将其从map中除去。

public class LeetCode437 {
    public int pathSum(TreeNode root, int targetSum) {
        //key是前缀和,value是大小为key的前缀和出现的次数
        Map<Long, Integer> prefixSumCount = new HashMap<>();
        //前缀和为0的一条路径
        prefixSumCount.put(0L,1);
        //前缀和的递归回溯思路
        return recursionPathSum(root,prefixSumCount,targetSum,0L);
    }

    /**
     * 从当前节点反推到根节点(反推比较好理解,正向其实也只有一条),有且仅有一条路径,因为这是一棵树
     * 如果此前有和为currSum-target,而当前的和又为currSum,两者的差就肯定为target了
     * 所以前缀和对于当前路径来说是唯一的,当前记录的前缀和,在回溯结束,回到本层时去除,保证其不影响其他分支的结果
     * @param node 树节点
     * @param prefixSumCount 前缀和Map
     * @param target 目标值
     * @param currSum 当前路径和
     * @return 满足题意的解
     */
    private int recursionPathSum(TreeNode node, Map<Long, Integer> prefixSumCount, int target, long currSum) {
        //递归终止条件
        if (node == null) {
            return 0;
        }

        int res = 0;
        //当前路径和,当前层
        currSum += node.val;
        // 看看root到当前节点这条路上是否存在节点前缀和加target为currSum的路径
        // 当前节点->root节点反推,有且仅有一条路径,如果此前有和为currSum-target,而当前的和又为currSum,两者的差就肯定为target了
        // currSum-target相当于找路径的起点,起点的sum+target=currSum,当前点到起点的距离就是target
        res += prefixSumCount.getOrDefault(currSum-target,0);
        //更新路径上当前节点前缀的个数
        prefixSumCount.put(currSum,prefixSumCount.getOrDefault(currSum,0)+1);

        //进入下一层
        res += recursionPathSum(node.left,prefixSumCount,target,currSum);
        res += recursionPathSum(node.right,prefixSumCount,target,currSum);

        //回到本层,回复状态,去除当前节点的前缀和数量
        prefixSumCount.put(currSum,prefixSumCount.get(currSum) - 1) ;
        return res;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode437:路径总和III 的相关文章

  • Faster R-CNN论文解读

    文章目录 AbstractIntroduction缘由RPN训练方案 Faster R CNN整体流程Conv layersRPNclsreganchorTranslation Invariant AnchorsMuti Scale Anc
  • c语言输入字符时控制符%c前加空格的原因解释

    文章目录 一 前景知识1 缓冲区2 标准输入流 二 scanf语句的执行1 scanf对于整形 d的输入2 scanf对于字符 c的输入 在编一个代码时偶然间发现一个知识盲点 用scanf语句输入字符时需要在控制符 c前加空格 在解释相关这
  • 解决c++中头文件重复包含的问题

    前言 c 43 43 项目中经常会使用到自己定义的一些函数和接口 xff0c 我们通常在头文件中包含进来 xff0c 但这样存在头文件被多次包含的危险 xff0c 导致编译报错 xff0c 以下介绍了几种常用的解决方法 一 采用宏定义的方法
  • 华为交换机5700 SSH配置

    一 在本地设备服务端生成密匙 Huawei rsa local span class token operator span span class token keyword key span span class token operat

随机推荐

  • 函数模板、类模板

    泛型编程 泛型编程 xff1a 编写与类型无关的通用代码 xff0c 是代码复用的一种手段 模板是泛型编程的基础 函数模板 函数模板代表了一个函数家族 xff0c 该函数模板与类型无关 xff0c 在使用时被参数化 xff0c 根据实参类型
  • STM32 第4讲 STM32原理图

    本文为学习正点原子得笔记 xff0c 主要讲解STM32原理图绘制 xff0c 主要由最小系统 43 IO口分布两步完成 引脚分布 STM引脚分类 xff1a 电源引脚晶振引脚复位引脚下载引脚 xff1a JTAG SWD 串口 JTAG
  • STM32 第12讲 GPIO:结构/8种工作模式/寄存器/驱动模型/配置步骤/实验

    文章目录 GPIO简介GPIO特点电气特性GPIO引脚分布 GPIO8种工作模式GPIO的基本结构8种工作模式 GPIO寄存器GPIO端口模式寄存器 xff08 GPIOx MODER xff09 GPIO端口输出类型寄存器 xff08 G
  • PID/LQR/MPC自行总结使用

    PID LQR MPC自行总结使用 自学控制相关知识 xff0c 已经一年多了 xff0c 现在回头看看还是有很多模糊不明确的地方 xff0c 准备借此机会进行总结一下 xff0c 第一次写博客 xff0c 如果错误和不合理之处 xff0c
  • 对 torch.nn.Linear 的理解

    torch nn Linear 是 pytorch 的线性变换层 xff0c 定义如下 xff1a Linear in features int out features int bias bool 61 True device Any N
  • rosdep init 错误解决终极方法(药到病除)

    rosdep init 错误解决方法 一 安装ROS执行以下指令时报错二 原因三 解决办法1 查询IP地址2 将IP地址添加进文件3 重新执行指令 成功解决 xff01 xff01 xff01 一 安装ROS执行以下指令时报错 sudo r
  • Intel Realsense T265 在ubuntu下的环境配置

    Intel Realsense T265 在ubuntu下的环境配置 一 T265介绍二 realsense SDK 安装配置1 注册服务器的公钥2 将服务器添加到存储库列表3 安装所需的库 xff0c 开发者和调试包5 插上T265打开
  • SLAM图优化一

    前言 SLAM问题的处理方法主要分为滤波和图优化两类 滤波的方法中常见的是扩展卡尔曼滤波 粒子滤波 信息滤波等 xff0c 熟悉滤波思想的同学应该容易知道这类SLAM问题是递增的 实时的处理数据并矫正机器人位姿 比如基于粒子滤波的SLAM的
  • 编程实现MapReduce操作

    文章目录 一 MapReduce的WordCount应用二 Partitioner 操作三 xff0e 排序实现四 xff0e 二次排序实现五 hadoop实现六 出现的问题与解决方案 提示 xff1a 以下是本篇文章正文内容 xff0c
  • React项目中TS报错解决方案

    Umi amp amp React amp amp Vue3 amp amp TS报错解决方案总结 个人向 Redux开发工具报错window下没有某属性 解决方案 项目根目录创建global d ts文件 span class token
  • Nvidia NX 运行vins-fusion + DenseSurfelMapping

    Nvidia NX 运行vins fusion 43 DenseSurfelMapping 实现姿态估计和稠密建图 xff0c 记录自用 参考博客 xff1a 使用Realsense D435i运行VINS Fusion并建图 从零开始使用
  • UR5机械臂与realsense相机在Gazebo仿真环境下的手眼标定(眼在手上)

    简介 这是一个Gazebo仿真环境下利用UR5机械臂和realsense相机进行手眼标定的教程 xff08 眼在手上 xff09 准备相关文件 span class token constant UR5 span git clone htt
  • 六,WiFi天猫精灵零配详解

    1 xff0c IOT设备配网方法 smartconfig手机热点配网设备热点配网路由器热点配网扫描二维码配网 2 xff0c 什么是零配 概念 xff1a 让已连网的设备告诉未配网的设备路由器的SSID和密码 xff08 天猫精灵语音寻找
  • 蓝牙Mesh

    1 蓝牙mesh介绍 蓝牙Mesh网络模型 xff1a 蓝牙Mesh提高灵活度 xff1a 代理节点 xff08 Proxy xff09 低功耗节点 xff08 Low Power xff09 转发节点 xff08 Relay xff09
  • 实践:设计SLAM系统

    实现一个双目视觉里程计在Kitti数据集中的运行效果 很有必要多看几遍的例程 这个视觉里程计由一个光流追踪的前端和一个局部BA的后端组成 双目只需单帧就可初始化 xff0c 双目存在3D观测 xff0c 实现效果比单目好 程序 xff1a
  • Pytorch 中 Embedding 类详解

    在 NLP 领域 xff0c 可以使用 Pytorch 的 torch nn Embeding 类对数据进行词嵌入预处理 关于词嵌入的解释这里就不做解释咯 xff0c 不明白的阔以先出门左拐找百度 重点说下这个 Embeding 类怎么用的
  • 工业相机测距开发(2):实战篇

    前言 本文将不再涉及原理部分 xff0c 想要了解基础知识的话 xff0c 请看上一篇的文章 xff0c 我们使用的是opencv的里面的函数 xff0c 这里面也是重点看这个函数们 xff0c 我们通过这个函数来得到外参 xff0c 在通
  • LeetCode406:根据身高重建队列

    要求 假设有打乱顺序的一群人站成一个队列 xff0c 数组 people 表示队列中一些人的属性 xff08 不一定按顺序 xff09 每个 people i 61 hi ki 表示第 i 个人的身高为 hi xff0c 前面 正好 有 k
  • LeetCode416:分割等和子集

    要求 给你一个 只包含正整数 的 非空 数组 nums 请你判断是否可以将这个数组分割成两个子集 xff0c 使得两个子集的元素和相等 思路 做一个等价转换 xff1a 是否可以从输入数组中挑选出一些正整数 xff0c 使得这些数的和 等于
  • LeetCode437:路径总和III

    要求 给定一个二叉树的根节点 root xff0c 和一个整数 targetSum xff0c 求该二叉树里节点值之和等于 targetSum 的 路径 的数目 路径 不需要从根节点开始 xff0c 也不需要在叶子节点结束 xff0c 但是