java数据结构与算法刷题-----LeetCode437. 路径总和 III(前缀和必须掌握)

Java实现 LeetCode 437 路径总和 III(三) 437. 路径总和 III 给定一个二叉树,它的每个结点都存放着一个整数值。 找出路径和等于给定数值的路径总数。 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。 二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。 示例: root = [10,5,-3,3,2,null,11,3,-2,null,1], ... 阅读详情
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/123063846

在这里插入图片描述

1. 深度优先

解题思路:时间复杂度O( n 2 n^2 n2),空间复杂度O(n)
  1. 从最下层结点开始,以每个结点为根结点,再次从上到下深度优先遍历
  2. 试图找到符合条件的路径
  3. 很显然,是双重深度优先遍历
  4. 先深度优先遍历所有结点,然后每个结点还得再深度优先遍历一下找路径
  5. 所以是N^2时间复杂度
代码

在这里插入图片描述

class Solution {
    //计算路径和
    public int pathSum(TreeNode root, int targetSum) {
        if (root == null) {
            return 0;
        }
        //获取以当前为根结点的路径和
        int ret = rootSum(root, targetSum);
        //深度优先遍历
        ret += pathSum(root.left, targetSum);
        ret += pathSum(root.right, targetSum);
        return ret;
    }
    //计算当前根结点的路径和,对于每个结点都进行从上到下的深度优先遍历
    //看看有没有符合条件的路径-------穷举法
    public int rootSum(TreeNode root, long targetSum) {
        int ret = 0;//深度优先,记录符合条件的路径数目

        if (root == null) {
            return 0;
        }
        int val = root.val;//获取当前结点值
        if (val == targetSum) {//如果当前值 == targetSum 结果+1,注意这里targetSum是减去前面结点,还需要多少
            ret++;
        } 
        //深度优先,传入,targetSum - 当前结点值,还需要多少
        ret += rootSum(root.left, targetSum - val);//左子树符合条件的
        ret += rootSum(root.right, targetSum - val);//右子树符合条件的
        return ret;//返回当前结点符合条件的
    }
}

2. 前缀和

解题思路:时间复杂度O(n),空间复杂度O(n).其中空间复杂度是2n,因为需要一个map,深度优先遍历需要栈空间也是n,所以是2n时间复杂度,比上一个方法的空间复杂度多一倍。但是时间复杂度比它快n倍
  1. 深度优先遍历
  2. 遍历过程中,记录前缀和(就是从根结点到当前结点的和)到map中
  3. 每遍历一个结点,都用当前前缀和 - 目标值,看看差多少,并从map中找这个差值
  1. 如果找到这个差值,说明当前前缀 - 当前路径上的某个子前缀,是一个符合条件的路径
  2. 如果没有,说明没找到,继续向下遍历
  1. 当某个结点深度遍历完成,向上返回时,那么包含这个结点的前缀和就没有用了,需要从map中去掉
图解:找目标路径长度为8
  1. 初始状态下,前缀map,key保存前缀0,value保存此前缀有几个,为1
    在这里插入图片描述
  2. 深度遍历根结点10,则当前路径前缀长度为10,10 - 8 = 2,也就是当前前缀比目标值多2.不符合条件。继续深度优先遍历,并将当前前缀和10放入map,此前缀有目前有1个
    在这里插入图片描述
  3. 深度遍历到结点5,当前路径前缀和为15,15-8 = 7,map中找7找不到,所以将15:1放入map
    在这里插入图片描述
  4. 继续遍历到结点3,当前路径前缀和为18,18 - 8 = 10.此时map中发现10,也就是说,当前路径比目标值8多10,而10就在此路径的子前缀中,所以我们可以去掉10这个结点,这样我们就找到了第一个符合条件的路径,5和3。另外不要忘了将当前前缀和放入map,也就是18:1放入map
    在这里插入图片描述
  5. 继续向下,遍历结点3,此时发现前缀和为21,21 - 8 = 13,map中没有,放入前缀和21:1
    在这里插入图片描述
  6. 继续向下,我们发现已经到底,需要回溯了,回到父结点之前,需要先删除当前前缀和,21:1,然后再回父结点。之后继续遍历,重复上述步骤。
    在这里插入图片描述
代码: 官方增加了测试用例,所以相同的代码已经无法击败100%了

在这里插入图片描述

class Solution {
    public int pathSum(TreeNode root, int targetSum) {
        Map<Long, Integer> prefix = new HashMap<Long, Integer>();//用Map保存前缀和
        prefix.put(0L, 1);//初始放入前缀和0,和其1
        return dfs(root, prefix, 0, targetSum);//进入递归
    }

    public int dfs(TreeNode root, Map<Long, Integer> prefix, long curr, int targetSum) {
        if (root == null) return 0;

        int ret = 0;//符合条件的路径条数
        curr += root.val;//当前路径值(前缀和)
        //看看当前路径和 - 目标值,是否等于路径上的一个前缀
        //如果是的话,说明当前路径,去掉某些前缀结点,刚好符合targetSum
        //如果没有,那么ret依然是0
        ret = prefix.getOrDefault(curr - targetSum, 0);
        //将当前路径前缀和,加入到map中
        prefix.put(curr, prefix.getOrDefault(curr, 0) + 1);
        //深度优先
        ret += dfs(root.left, prefix, curr, targetSum);
        ret += dfs(root.right, prefix, curr, targetSum);
        //----------当此结点的遍历出栈时,要将map中对应的前缀和去掉。否则其它路径的前缀和很可能和当前路径的前缀和冲突-------------
        prefix.put(curr, prefix.getOrDefault(curr, 0) - 1);
        //返回符合条件路径条数
        return ret;
    }
}
机器视觉--线扫相机触发:从原理到选型,构建高效成像方案 本文深入解析线扫相机触发技术,从硬件编码器触发到软件触发方案,提供详细的性能对比和选型指南。通过实际案例展示如何构建高效成像方案,特别适合机器视觉领域需要精准控制的应用场景,如工业检测和自动化生产线。 阅读详情

相关推荐

解密微信DAT图片:一键转换JPG/PNG/GIF的实用指南

本文详细解析微信DAT图片的加密机制及转换方法,提供从定位文件到使用WeijieSoft工具一键转换JPG/PNG/GIF的完整指南。涵盖新旧版微信存储路径差异、批量处理技巧及常见问题解决方案,帮助用户高效恢复重要图片并释放存储空间。

weixin_29305337的博客 3624

437. 路径总和 III ●●

437. 路径总和 III ●●、二叉树、深度优先搜索、前缀和

chenyfan_blog 600

深入解析Zynq Ultrascale+ RF Data Converter中的PLL配置与时钟管理

本文深入解析了Zynq Ultrascale+ RF Data Converter中PLL配置与时钟管理的核心原理与实践。文章将RFDC时钟系统比作交响乐团,详细阐述了PLL作为指挥的关键作用,以及系统时钟、Tile时钟、参考时钟与采样时钟的层级关系。重点剖析了PLL配置参数(如VCO频率、分频器设置)的计算方法与稳定性考量,并提供了从IP配置使能顺序到多Tile同步、DRP访问等常见问题的实战避坑指南与调试技巧,帮助工程师构建稳定的射频信号处理基石。

7up55的博客 452

Leetcode(437)——路径总和 III

Leetcode(437)——路径总和 III 题目 给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。 示例 1: 输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8 输出:3 解释:和等于 8 的路径有 3 条,如图所示。 示例 2: 输入:ro

KCDCY的博客 1165

SAP FICO会计凭证过账接口

-------------------------------------增加职能范围-ZHANGZG-2022.09.07 注释掉-2022.09.20。CONCATENATE '总账' ls_doc_item-hkont '要求输入成本对象值!*-------------------------------------增加职能范围-ZHANGZG-2022.09.07。*-------------------------------------增加职能范围-ZHANGZG-2022.09.07。

dingqing86的专栏 1080

手把手教你学Simulink——基于Simulink的变换器老化预测与数字孪生(Digital Twin)

这不仅是技术的演进,更是从“事后救火”到“事前预言”的降维打击。:通过本文的实战演练,你不仅掌握了功率变换器“电气-热-老化”多物理场耦合的建模哲学,更深刻领悟了如何将高深的随机过程(粒子滤波)降维成可落地、可量产的工程工具;:起初,由于数据量少,粒子滤波器预测的剩余寿命(RUL)置信区间(95%)非常宽泛(如 1000~2000小时)。在工业4.0与智能制造的浪潮下,功率变换器(如光伏逆变器、车载OBC、服务器电源)不再是孤立的硬件,而是具备“自我感知”与“寿命预知”的智能节点。

MHD0815的博客 299

【LeetCode】 hot100— 437. 路径总和 III_前缀和

给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的。输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8。不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。解释:和等于 8 的路径有 3 条,如图所示。

weixin_44382896的博客 1341

matlab 点云均值、中值、高斯滤波【2024最新版】

点云均值滤波、中值滤波、高斯滤波的matlab自带函数实现。博客长期更新,本文最近一次更新时间为:2024年11月9日。

点云侠的博客 5260

力扣刷题记录 -- JAVA--47---437. 路径总和 III

【代码】力扣刷题记录 -- JAVA--47---437. 路径总和 III。

taiyuezyh的博客 147

【花雕学编程】Arduino FOC 之AS5048A磁编码器模块

您的硬件平台、使用场景和Arduino版本可能影响使用方法的选择。在Arduino平台上实现FOC可以提供平滑的运行和高度的扭矩、速度和位置控制,它通过精确控制电机的电流和电压来实现高效率、高精度和低噪声的操作。5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。1、高性能电机控制:FOC是一种高级的电机控制算法,可以精准控制PMSM(永磁同步电机)和BLDC(无刷直流)电机,实现平滑的转速和扭矩输出。

雕爷学编程 1496

前端使用二开Thingsboard一、二、三事(四)-部件库

以项目实战为基础,逐步介绍前端在thingsboard系统二次开发中的一些注意事项以及一些thingsboard一些页面功能讲解,为前端人员开发使用thingsboard提供一种可靠思路,打造一个完美的物联网系统。

weixin_43163457的博客 742

leetcode437-路径总和III

leetcode437-路径总和III

weixin_45799371的博客 1233

【漏洞复现】用友U9 UMWebService.asmx 任意文件读取漏洞

用友U9存在任意文件读取漏洞,未授权的攻击者可以通过该漏洞读取服务器任意文件,造成敏感信息泄露。

qq_67810151的博客 620

leetcode刷题记录(八十)——437. 路径总和 III

437. 路径总和 III - 力扣(LeetCode)437. 路径总和 III - 给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

weixin_45994787的博客 829

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

LeetCode 437. 路径总和 III

给定一个二叉树的根节点root,和一个整数targetSum,求该二叉树里节点值之和等于targetSum的的数目。不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。3和等于 8 的路径有 3 条,如图所示。3。

m0_56090828的博客 1110

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

LeetCode 437. 路径总和 III - 前缀和哈希与DFS回溯详解

题目描述:给定一棵二叉树的根节点 root 和一个整数 targetSum,统计树中路径和等于 targetSum 的路径数量。路径需沿父到子方向向下(可从任意节点开始、任意节点结束),但必须连续连接父子边。原题链接:https://leetcode.cn/problems/path-sum-iii/难度等级:Medium相关标签:二叉树、DFS、前缀和、哈希表、回溯| 解法 | 时间复杂度 | 空间复杂度 | 优点 | 缺点 | 适用场景 |

m0_52114506的博客 1101

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【LeetCode: 437. 路径总和 III + 二叉树 + 递归】

【LeetCode: 437. 路径总和 III + 二叉树 + 递归】给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

Coder_ljw的博客 1723

437. 路径总和 III

两数之和的树上版:在一条从根垂下来的绳子上,找一段中间的绳子,使得它的长度等于 Target。前缀和公式。查找策略:当我们走到一个节点,当前的从根累加和为s。我们要问哈希表:“在我祖先的路径上,有没有哪个前缀和等于?”如果有,说明中间夹着的那一段路径和就是targetSum。

一同进步 535

【LeetCode热题100】Java详解:路径总和 III(含O(N²)暴力解与O(N)前缀和优化)

前缀和思想:将O(N²)降为O(N)哈希表快速查找:避免重复计算一次遍历:每个节点只处理一次暴力解法:展示问题理解,但效率低下前缀和优化:将树路径问题转化为数组子数组问题回溯技巧:维护路径状态的关键空间换时间:哈希表存储历史状态,避免重复计算。

吾为热爱计科,致力于知识分享的践行者,此博客是我在这条道路上留下的足迹。 1076

LeetCode100之路径总和III(437)--Java

这道题我们用前缀和进行优化的解法比求出每一个节点的路径的解法,在效率上相差了15倍左右,如果可以的话,我建议大家讲前缀和的这种方法掌握下来。

2301_79318558的博客 1025

leetcode hot100【LeetCode 437.路径总和 III】java实现

LeetCode 437.路径总和 III-二叉树

DataCrafter的博客 674

【刷题1】LeetCode 437. 路径总和 III java题解

题目 437. 路径总和 III 分析 前缀和的适用场景:求任意不含环的结构,任意节点开头的路径和等于某个定值问题,都可以套用前缀和这个方法。 代码最后为什么要回到本层恢复状态?因为到了最后,回到本层,表示当前层递归完成,要返回上一层,所以要清空这一层的状态,因为map传递的是一个对象,状态被修改了,为了不影响后面的递归遍历,就要清除本层做的操作。某个节点的左子树节点不会出现它的右子树的任何节点路径上的。 代码 /** * Definition for a binary tree node. * pu

乾坤未定,你我皆是黑马 418

【Hot100】LeetCode—437. 路径总和 III

【代码】【Hot100】LeetCode—437. 路径总和 III。

weixin_44382896的博客 667

leetcode 437 路径总和 III -java版

文章目录题目代码 题目 给定一个二叉树,它的每个结点都存放着一个整数值。 找出路径和等于给定数值的路径总数。 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。 二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。 示例: root = [10,5,-3,3,2,null,11,3,-2,null,1], su...

lingle1的博客 457

LeetCode路径总和系列问题解析:I、II、III的解决方案与优化

问题核心方法时间复杂度空间复杂度关键难点路径总和 I递归遍历O(n)O(n)终止条件判断路径总和 II回溯+路径记录O(n)O(n²)深拷贝与回溯逻辑路径总和 III前缀和+哈希表O(n)O(n)前缀和统计与回溯维护路径总和I:基础递归应用,理解终止条件与递归分解。路径总和II:掌握回溯法维护路径状态,注意深拷贝避免引用问题。路径总和III:前缀和优化是核心,通过空间换时间避免重复计算。

weixin_44435110的博客 950

LeetCode经典算法面试题 #437:路径总和 III(回溯、记忆化搜索等五种实现方案详细解析)

本文探讨了在二叉树中寻找节点值之和等于目标值的路径数目问题。文章介绍了两种主要解法:暴力递归法和前缀和哈希表优化法。暴力法通过双重递归遍历所有可能的路径起点和终点,时间复杂度为O(n²);而前缀和方法利用哈希表存储历史路径和,将问题转化为两数之差问题,将时间复杂度优化至O(n)。两种方法各有优劣,前者实现简单但效率较低,后者性能更优但需要理解前缀和思想。文章还提供了详细的Java代码实现和复杂度分析,为处理类似二叉树路径问题提供了实用参考。

夏日清风 705
上一篇: java数据结构与算法刷题-----LeetCode543. 二叉树的直径
下一篇: java数据结构与算法刷题-----LeetCode572. 另一棵树的子树(经典题,树字符串化KMP)
ydenergy_殷志鹏
博客等级 码龄7年 5886粉丝 543原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydenergy_殷志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值