leetcode437-路径总和III

leetcode 437
在这里插入图片描述

思路

利用前缀和+hash map解答

前缀和在这里的含义是:从根节点到当前节点的路径上所有节点值的总和
我们使用一个 Map 数据结构来记录这些前缀和及其出现的次数
具体思路如下:

  1. 初始化:创建一个 Map ,并将前缀和 0 出现的次数初始化为 1 。这是因为在遍历开始时,我们还没有访问任何节点,此时的前缀和就是 0 ,它的出现次数为 1 次。同时,初始化一个变量 count 用于记录满足条件的路径数量,初始值为 0
const map = new Map();​
map.set(0, 1);let count = 0;
  1. 深度优先搜索:定义一个递归函数 deep 用于进行深度优先遍历。在每次递归中,我们计算当前节点的前缀和 curSum ,它等于从根节点到上一个节点的前缀和 sum 加上当前节点的值 root.val
const deep = (root, sum) => {if (!root) return;const curSum = sum + root.val;
  1. 判断是否存在满足条件的路径:计算当前前缀和 curSum 与目标值 targetSum 的差值 diff ,即 diff = curSum - targetSum 。如果 Map 中存在 diff 这个前缀和,说明从根节点到当前节点的路径中,存在一段子路径的和等于目标值 targetSum ,那么满足条件的路径数量就需要加上 diff 出现的次数
const diff = curSum - targetSum​
if (map.has(diff)) {​count += map.get(diff);}
  1. 更新前缀和及其出现次数:如果 Map 中已经存在当前前缀和 curSum ,则将其出现次数加 1 ;否则,将 curSum 加入 Map ,并将其出现次数设置为 1
if (map.has(curSum)) {​map.set(curSum, map.get(curSum) + 1)} else {​map.set(curSum, 1)}
  1. 继续递归遍历左右子树:分别对当前节点的左子树和右子树进行递归调用,继续计算子树中的前缀和
root.left && deep(root.left, curSum)​
root.right && deep(root.right, curSum)
  1. 回溯:在递归返回时,需要进行回溯操作。因为我们已经遍历完当前节点的子树,要回到上一层节点继续遍历,所以需要将当前前缀和 curSum 的出现次数减 1 ,以保证 Map 中记录的前缀和状态只反映从根节点到当前层节点的情况
map.set(curSum, map.get(curSum) - 1)

难点-使用回溯

在本题实现的过程中,可能会忽略掉回溯的步骤

那么为什么需要回溯操作

模拟实现:考虑如下二叉树(目标和 targetSum = -1):

    1/ \-2  -3

若无回溯:

  1. 遍历根节点 1
    • 前缀和 curSum = 1,差值 1 - (-1) = 2,map 中无 2,不计数
    • map 状态:{0:1, 1:1}
    • 递归左子树 -2
  2. 遍历左子节点 -2
    • 前缀和 curSum = 1 + (-2) = -1,差值 -1 - (-1) = 0,map 中存在 0(初始值),计数 + 1(路径[1, -2]正确)。
    • 未回溯时,map 状态:{0:1, 1:1, -1:1}(保留 -1 的计数)。
    • 左、右子树为空,返回根节点
  3. 递归右子树 -3
    • 前缀和 curSum = 1 + (-3) = -2,差值 -2 - (-1) = -1
    • 此时 map 中存在 -1(来自左子树的记录),算法错误认为存在路径和为 -1,计数 + 1
    • 错误结果:count = 2,但实际仅[1, -2]满足条件

其实在这里第三步中diff = -1此时map中不应该存在-1这一项,因为这里的map只是1->-3 ,却把1->2的部分也存储了起来,导致结果的不准确,使得1->2这条路径重复计算,结果出错

回溯的作用(有回溯时)

  • 离开左子节点 -2 时,执行 map.set(-1, 0),map 恢复为 {0:1, 1:1}。
  • 遍历右子树 -3 时,前缀和 -2 的差值 -1 在 map 中无匹配,不计数。
  • 正确结果:count = 1

实现

var pathSum = function (root, targetSum) {const map = new Map();map.set(0, 1);let count = 0; // 满足条件的路径const deep = (root, sum) => {if (!root) return;const curSum = sum + root.val;const diff = curSum - targetSumif (map.has(diff)) {count += map.get(diff);}if (map.has(curSum)) {map.set(curSum, map.get(curSum) + 1)} else {map.set(curSum, 1)}// 左root.left && deep(root.left, curSum)// 右root.right && deep(root.right, curSum)// 回溯map.set(curSum, map.get(curSum) - 1)}deep(root, 0)return count;
};

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

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

相关文章

UI前端与数字孪生融合探索新领域:智慧家居的可视化设计与实现

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 一、引言:智慧家居的数字化转型浪潮 在物联网与人工智能技术的推动下&#xff0c…

数据结构知识点总结--绪论

1.1 数据结构的基本概念 1.1.1 基本概念和术语 主要涉及概念有: 数据、数据元素、数据对象、数据类型、数据结构 #mermaid-svg-uyyvX6J6ofC9rFSB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-uyyvX6…

pip install mathutils 安装 Blender 的 mathutils 模块时,编译失败了

你遇到的问题是因为你试图通过 pip install mathutils 安装 Blender 的 mathutils 模块时,编译失败了,主要原因是: 2018年 的老版本也不行 pip install mathutils2.79 ❌ 报错核心总结: 缺失头文件 BLI_path_util.h:…

编译安装交叉工具链 riscv-gnu-toolchain

参考链接: https://zhuanlan.zhihu.com/p/258394849 1,下载源码 git clone https://gitee.com/mirrors/riscv-gnu-toolchain 2,进入目录 cd riscv-gnu-toolchain 3,去掉qemu git rm qemu 4,初始化 git submodule…

复制 生成二维码

一、安装插件 1、复制 npm install -g copy-to-clipboard import copy from copy-to-clipboard; 2、生成二维码 & 下载 npm install -g qrcode import QRCode from qrcode.react; 二、功能:生成二维码 & 下载 效果图 1、常规使用(下载图片模糊…

自由职业的经营视角

“领导力的核心是帮助他人看到自己看不到的东西。” — 彼得圣吉 最近与一些自由职业者的交流中,发现很多专业人士都会从专业视角来做交流,这也让我更加理解我们海外战略顾问庄老师在每月辅导时的提醒——经营者视角和专业人士视角的不同。这不仅让大家获…

MR30分布式 IO在物流堆垛机的应用

在现代物流行业蓬勃发展的浪潮中,物流堆垛机作为自动化仓储系统的核心设备,承担着货物的高效存取与搬运任务。它凭借自动化操作、高精度定位等优势,极大地提升了仓储空间利用率和货物周转效率。然而,随着物流行业的高速发展&#…

告别固定密钥!在单一账户下用 Cognito 实现 AWS CLI 的 MFA 单点登录

大家好,很多朋友,特别是通过合作伙伴或服务商使用 AWS 的同学,可能会发现自己的 IAM Identity Center 功能受限,无法像在组织管理账户里那样轻松配置 CLI 的 SSO (aws configure sso)。那么,我们就要放弃治疗&#xff…

未来机器视觉软件将更注重成本控制,边缘性能,鲁棒性、多平台支持、模块优化与性能提升,最新版本opencv-4.11.0更新了什么

OpenCV 4.11.0 作为 4.10.0 的后续版本,虽然没有在提供的搜索结果中直接列出详细更新内容,但结合 OpenCV 4.10.0 的重大改进方向(发布于 2024 年 6 月),可以合理推断 4.11.0 版本可能延续了对多平台支持、模块优化和性能提升的强化。以下是基于 OpenCV 近期更新模式的推测…

小程序入门:数据请求全解析

在微信小程序开发中,数据请求是实现丰富功能的关键环节。本文将带你深入了解小程序数据请求的相关知识,包括请求限制、配置方法以及不同请求方式的实现,还会介绍如何在页面加载时自动请求数据,同时附上详细代码示例,让…

开源版gpt4o 多模态MiniGPT-4 实现原理详解

MiniGPT-4是开源的GPT-4的平民版。本文用带你快速掌握多模态大模型MiniGPT-4的模型架构、训练秘诀、实战亮点与改进方向。 1 模型架构全景:三层协同 📊 模型底部实际输入图像,经 ViT Q-Former 编码。蓝色方块 (视觉编码器):左侧…

Flutter基础(控制器)

第1步:找个遥控器(创建控制器)​ // 就像买新遥控器要装电池 TextEditingController myController TextEditingController(); ​​第2步:连上你的玩具(绑定到组件)​​ TextField(controller: myContro…

Spring Boot使用Redis常用场景

Spring Boot使用Redis常用场景 一、概述:Redis 是什么?为什么要用它? Redis(Remote Dictionary Server)是一个内存中的数据存储系统(类似一个“超级大字典”),它能存各种类型的数据…

CAD文件处理控件Aspose.CAD教程:在 C# 中将 DXF 文件转换为 SVG - AutoCAD C# 示例

概述 使用 C# 轻松将DXF文件转换为SVG。此转换可更好地兼容 Web 应用程序,并增强 CAD 图纸的视觉呈现效果。使用Aspose.CAD for .NET ,开发人员可以轻松实现此转换过程。该 SDK 提供强大的功能,使其成为 C# 开发人员的可靠选择。Aspose.CAD …

Gitee 持续集成与交付(CI/CD)篇

Gitee 持续集成与交付(CI/CD)篇 🚀 文章目录 Gitee 持续集成与交付(CI/CD)篇 🚀🎯 什么是 CI/CD?🌟 Gitee Go 介绍✨ 核心特性🎨 支持的技术栈 🚀…

深度学习:PyTorch卷积神经网络图像分类案例分享

本文目录: 一、了解CIFAR-10数据集二、案例之导包三、案例之创建数据集四、案例之搭建神经网络(模型构建)五、案例之编写训练函数(训练模型)六、案例之编写预测函数(模型测试) 前言:…

记录多功能按键第二种写法使用定时器周期间隔判断.

逻辑是通过定时器溢出周期进行判断按下次数 比如设置定时器溢出周期为500MS,每次溢出都会判断按键按下次数,如果下个周期前没有触发按下,则结束键值判断.并确定触发键值.清空按下次数标志.测试比一个定时器周期按下按键次数判断写法要稳定... 记录STM32实现多功能按键_stm32一…

【安卓Sensor框架-1】SensorService 的启动流程

内核启动后,首个用户空间进程init(pid1)解析init.rc配置文件,启动关键服务(如Zygote和ServiceManager)。 Zygote服务配置为/system/bin/app_process --zygote --start-system-server,后续用于孵…

centos网卡绑定参考

同事整理分享: 1. 加载 Bonding 模块 modprobe bonding 获取网卡名称 ip a 找到接了网线的网卡名称,记下。 3. 配置物理网卡 创建并编辑 /etc/sysconfig/network-scripts/ifcfg-ens36(ifcfg-后面的内容根据上面找到的具体网卡名称决定&#…

mbedtls ssl handshake error,res:-0x2700

用LinkSDK.c连接第三方云平台出现现象 解决方案: 在_tls_network_establish函数中加入 mbedtls_ssl_conf_authmode(&adapter_handle->mbedtls.ssl_config, MBEDTLS_SSL_VERIFY_NONE);原因解释:用连接方式是不用证书认证/跳过服务端认证。