hot100 437.路径总和Ⅲ

思路:前缀和解法,利用前缀和求节点值之和等于targetSum的路径的数目(满足路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的,只能从父节点到子节点)。

一、前缀和定义:

1.定义:一个节点的前缀和就是该节点到根之间的路径和。

2.举例:如下图所示。

(1)节点4的前缀和为:1 + 2 + 4 = 7。

(2)节点8的前缀和为:1 + 2 + 4 + 8 = 15。

(3)节点9的前缀和为:1 + 2 + 5 + 9 = 17。

二、本题中前缀和的作用:两节点间的路径和即为两节点的前缀和之差。

1.举例:

(1)如下图所示:假如题目给定数值为5,节点1的前缀和为1,节点3的前缀和为1 + 2 + 3 = 6。

(2)prefix(3) - prefix(1) == 5。

(3)所以节点1到节点3之间,有一条符合要求的路径2->3。

2.利用前缀和简化问题:我们只需要遍历整棵树一次,记录每个节点的前缀和,并查询该节点的祖先节点中符合条件的个数,将这个数量加到最终结果上。

三、HashMap存储数据:key存储前缀和,value是该前缀和的节点数量,记录数量是因为有出现重复路径的可能。

举例:如下图所示,改图中前缀和为1的节点有两个,分别是0和1,所以路径和为2的路径数就有两条,分别是0->2和2。

.

四、恢复状态的意义:

1.题目要求:路径方向必须是向下的,即只能从父节点到子节点。当计算两个节点的前缀和的差值时,其中一个节点必须是另一个节点的祖先节点。

2.换句话说,当我们把一个节点的前缀和信息更新到map里时,它应当只对其子节点们生效。

举例:下图中有两个值为2的节点A,B。

(1)当遍历到最右方的节点6时,对于它来说,此时的前缀和为2的节点只该有B,因为A并不是节点6的祖先节点。

(2)如果不做状态恢复的话,当遍历右子树时,左子树中A的信息仍会保留在map中,那么此时节点6就会认为A,B都是可追溯到的节点,从而产生错误。

3.状态恢复代码的作用:在遍历完一个节点的所有子节点后,将其从map中除去。

五、核心思想:寻找从根节点到当前节点的路径上,是否存在某个前缀和curSum - target。如果存在,则说明从那个前缀和对应的节点到当前节点的路径和正好等于target。

即:curSum - (curSum - target) == target。

附代码:

class Solution { Map<Long,Integer> prefixMap; int target; public int pathSum(TreeNode root, int targetSum) { prefixMap = new HashMap<>(); target = targetSum; // key表示前缀和,value表示前缀和为这个值的路径的数量。 // 初始化,表示空路径的前缀和为0,出现了1次,为了处理从根节点开始的路径 prefixMap.put(0L,1); return recur(root,0L); } // recur函数,用于遍历二叉树,对于每个节点,记录前缀和的同时,返回当前找到和为target的路径的数量 // curSum表示node节点之前的前缀和 private int recur(TreeNode node,Long curSum){ if(node == null){ return 0; } int res = 0; // 记录路径数量 curSum += node.val; // 根节点到当前节点的路径和 // 如果curSum - target在prefixMap中存在,则说明存在某个节点到当前节点的路径和等于target // curSum - (curSum - target) = target // 比如:target = 8,如果之前存在前缀和 = 5,且当前前缀和 = 13,那么13 - 5 = 8,说明从那个节点到当前节点的路径和为8 res += prefixMap.getOrDefault(curSum - target,0); // 把当前节点的前缀和也加入到哈希表中,value加1 prefixMap.put(curSum,prefixMap.getOrDefault(curSum,0) + 1); // 递归处理子树 int left = recur(node.left,curSum); int right = recur(node.right,curSum); res = res + left + right; // 所有找到的路径数量总和即为总的路径数量 // 恢复状态 prefixMap.put(curSum,prefixMap.get(curSum) - 1); // 当前节点处理完后,要返回到父节点,当前节点的前缀和不应该影响其他分支的统计。因此在遍历完一个节点的所有子节点后,将其从map中除去 return res; } }

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

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

相关文章

hot100 236.二叉树的最近公共祖先

见代码随想录 236.二叉树的最近公共祖先

考研C语言专题练习

考研C语言专题练习 引言 这篇文章的本质是我学完考研C语言之后做的针对所学内容的练习题目 题目一&#xff1a;挂盐水 题目链接&#xff1a;http://oj.lgwenda.com/problem/1014 这是我的想法&#xff0c;得分50&#xff0c;我的问题在于代码逻辑完全误解了题目描述的滴水和停顿…

太阳敏感器的高精度补偿标定方法

微纳卫星技术快速发展&#xff0c;太阳敏感器与磁强计、陀螺仪组成联合定姿系统&#xff0c;广泛用于太阳方位角测量。但传统产品存在精度不足的问题&#xff0c;现有补偿方法存在参数冗余、误差源覆盖不全或流程繁琐等问题。本文基于紫创测控luminbox的太阳光模拟器搭建标定系…

鼎先电子提供200多款从单通道到多通道的ESD防护器件,快充ESD解决方案

ESD8LVL5.0CT5G 0.25pF,4A ,40W低电容静电防护器件&#xff0c;旨在保护电压敏感元件免受静电放电&#xff08;ESD&#xff09;影响。出色的钳位能力、低泄漏和快速响应时间&#xff0c;使这些器件非常适合用于电路板空间有限的设计中的ESD保护。由于其尺寸小巧&#xff0c;适…

大功率防雷器件,低容集成阵列TVS

LC03-6.TBT,LC03-6R2G大功率集成阵列TVS Array 产品概述 TVS二极管是敏感半导体元件板级保护的理想选择。LCO3-6将TVS二极管与整流桥相结合&#xff0c;以单个器件在共模和差分模式下提供瞬态保护。器件的电容最小化(<25pF)&#xff0c;以确保高速线路上正确的信号传输。…

SOD-523二极管提供1线ESD保护(单向和双向)。这些器件符合IEC 61000-4-2标准DC0501D5 DC0521D5

SOD-523 ESD保护二极管采用小巧紧凑的封装&#xff0c;符合Rohs标准。SOD-523二极管提供1线ESD保护&#xff08;单向和双向&#xff09;。这些器件符合IEC 61000-4-2标准&#xff08;30/15kV接触放电和30/15kV空气放电&#xff09;。SOD-523 ESD保护二极管的工作电压为3.3V、5V…

7个 Golang 官方文档没细说的高效技巧

Go 的语法确实简单&#xff0c;但要在生产环境写出高性能代码&#xff0c;光靠语法糖是不够的。但很多时候&#xff0c;写出能跑的代码只是及格线&#xff0c;写出高性能、内存友好且易于维护的代码才是真正的门槛。 为了省心&#xff0c;我最近把本地环境换成了 ServBay。它最…

代码通胀时代,AI生成的代码需要 12 倍审查成本?

近日&#xff0c;有人在 Reddit 上算了一笔账&#xff0c;贡献者用 AI 生成一个 Pull Request (PR) 只需要 7 分钟&#xff0c;而维护者为了理解逻辑、排查隐患、测试运行&#xff0c;平均要花 85 分钟。 这就是著名的 Brandolini 定律&#xff08;又叫废话不对称原则&#xf…

c++ release下的debug

debug方法1,查看堆栈 最直接&#xff0c;调用顺序是最上面的最近调用。往下点直到自己的代码位置2&#xff0c;debug断点 3&#xff0c;查看内存&#xff1a;&#xff08;&#xff09;4&#xff0c;断电右键添加监视窗口 5&#xff0c;条件断点 release下设置断点调试的…

ssl免费证书与收费证书有什么区别

SSL免费证书与收费证书核心区别SSL免费与收费证书核心差异在安全等级、售后保障及企业适配性&#xff0c;均能实现网站HTTPS加密&#xff0c;但适用场景截然不同。免费证书多为DV型&#xff0c;仅验证域名归属&#xff0c;10分钟内快速签发&#xff0c;成本零门槛&#xff0c;适…

应用程序嵌入插件需要具备什么条件

应用程序插件化能力的深入分析 一、并非所有应用程序都能嵌入插件 1.1 支持插件化的应用程序特征 架构设计特征 ┌───────────────────────────────────┐ │ 可插件化的应用程序架构特征 │ ├───────────────…

给一个应用程序编写插件工作指南

为应用程序编写插件的全面准备工作指南 一、核心准备工作框架 技术调研 → 环境搭建 → 架构设计 → 开发实施 → 测试发布二、详细准备清单 2.1 前期调研与理解&#xff08;最重要的一步&#xff09; 了解目标应用程序 应用程序类型分析&#xff1a; 桌面应用&#xff08;…

如何在应用程序中安装插件并使用

应用程序与插件的关系、安装使用及核心机制 一、应用程序与插件的关系 1.1 基本关系 应用程序是独立运行的软件&#xff0c;而插件&#xff08;也称为扩展、附加组件&#xff09;是扩展应用程序功能的独立模块。它们的关系类似于&#xff1a; 主机与客体的关系&#xff1a;…

当蝗虫玩起了概率游戏:HCUGOA的整活现场

混合柯西变异和均匀分布的蝗虫优化算法 何庆 摘 要: 由于位置更新公式存在局部开发能力较强而全局探索能力较弱的缺陷,导致蝗虫优化算法(GOA)易陷入局部最优以及早熟收敛,对此,提出一种混合柯西变异和均匀分布的蝗虫优化算法(HCUGOA). 受柯西算子和粒子群算法的启发,提出具有分…

Spring Boot 项目使用 EasyExcel 实现导出功能

你想要在 Spring Boot 项目中基于 EasyExcel 完整实现 Excel 导出功能&#xff0c;我会为你梳理一套标准化、可直接落地的实现方案&#xff0c;包含基础导出、字段控制、异常处理等核心内容&#xff0c;确保功能健壮且符合开发规范。 一、完整实现步骤 环境准备&#xff08;引入…

人群仿真软件:Vadere_(11).Vadere与其他仿真软件的比较

Vadere与其他仿真软件的比较 在人群仿真软件领域&#xff0c;Vadere并不是唯一的选择。了解Vadere与其他仿真软件的差异和优势&#xff0c;可以帮助用户更好地选择适合自己需求的工具。本节将重点比较Vadere与其他流行的仿真软件&#xff0c;如AnyLogic、Simulink、Viswalk和M…

[Web自动化] 处理爬虫异常

9.3 处理爬虫异常 在网络爬虫中&#xff0c;异常处理是非常重要的一环。由于网络请求的不可预测性&#xff08;如网络延迟、服务器错误、内容变动等&#xff09;&#xff0c;爬虫程序很容易遇到各种异常情况。因此&#xff0c;学会如何优雅地处理这些异常&#xff0c;对于保证爬…

[Web自动化] 爬虫之网络请求

9.4 爬虫之网络请求 9.4.1 使用requests库发送HTTP请求 requests库提供了丰富的功能来发送HTTP请求&#xff0c;并处理响应。以下是一些额外的示例和说明。 发送带参数的GET请求&#xff1a; 如果你需要向服务器发送查询参数&#xff0c;可以将它们作为字典传递给params参数。 …

国产CAD这笔软件授权费,省得有点心疼

开厂子的&#xff0c;每天都在算账。原材料在涨价&#xff0c;人工工资在涨&#xff0c;连以前用的那套国外工业软件&#xff0c;每年的维护费和授权费也是一笔不小的开支。那软件功能是强大&#xff0c;但对于我们主要做中低端汽配件的来说&#xff0c;大部分功能根本用不上&a…

导师严选10个AI论文平台,助研究生轻松搞定论文写作!

导师严选10个AI论文平台&#xff0c;助研究生轻松搞定论文写作&#xff01; AI 工具如何改变论文写作的未来 在当今学术研究日益激烈的背景下&#xff0c;研究生们面临着前所未有的挑战。从选题到撰写&#xff0c;再到查重和修改&#xff0c;每一个环节都可能成为影响论文质量的…