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

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

文章目录

    • 1. 深度优先
    • 2. 前缀和

在这里插入图片描述

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,和其1return 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依然是0ret = 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;}
}

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

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

相关文章

kibana7.17.7 将数据导出csv文件

配置kibana文件 首先先配置kibana.yaml内容如下&#xff0c;这里假设我的服务器ip地址为192.168.130.128&#xff0c;elasticsearch的ip地址为&#xff1a;192.168.130.129:9200&#xff0c;192.168.130.130:9200&#xff1a; server.host: "192.168.130.128" serv…

每日OJ题_分治归并③_力扣315. 计算右侧小于当前元素的个数

目录 315. 计算右侧小于当前元素的个数 解析代码 力扣315. 计算右侧小于当前元素的个数 315. 计算右侧小于当前元素的个数 难度 困难 给你一个整数数组 nums &#xff0c;按要求返回一个新数组 counts 。数组 counts 有该性质&#xff1a; counts[i] 的值是 nums[i] 右侧…

MongoDB 未授权访问

开启 MongoDB 服务时不添加任何参数时,默认是没有权限验证的,而且可以远程访问数据库&#xff0c; 登录的 用户可以通过默认端口无需密码对数据库进行增、删、改、查等任意高危操作。 防护 为 MongoDB 添 加 认 证 &#xff1a; 1)MongoDB 启动时添加–auth参数 2)给 MongoD…

Java 读写 ini ( 调用 Windows Api )

市面上读取 ini 的包都是 读取整个文件到内存中,再获取和修改值, 最后自己再调用保存文件, 这种方式在读取大文件的时候 非常的不友好. windows api 中有现成的高效方法 安装 jna-platform (里面封装了各个系统的 api ,直接用就行. 不用再手动写固定的函数定义) jna-platfor…

JPA常见异常 JPA可能抛出的异常

1、EntityNotFoundException&#xff08;实体不存在异常&#xff09;: 通过 JPA 查找一个不存在的实体。 2、NonUniqueResultException&#xff08;非唯一结果异常&#xff09;&#xff1a; 查询返回了多个结果&#xff0c;但期望只有一个结果。 3、TransactionRequiredExcep…

AutoSAR(基础入门篇)13.1-EB Tresos使用初探

目录 一、新建工程 二、添加和删除模块 三、界面 四、代码生成 1、直接生成代码

Mac 以SH脚本安装Arthas

SH脚本安装Aethas curl -L https://alibaba.github.io/arthas/install.sh | sh安装脚本说明 示例源文件&#xff1a; #! /bin/bash# temp file of as.sh TEMP_ARTHAS_FILE"./as.sh.$$"# target file of as.sh TARGET_ARTHAS_FILE"./as.sh"# update timeo…

微服务中的Feign:优雅实现远程调用的秘密武器(一)

本系列文章简介&#xff1a; 本系列文章将深入探讨Feign的特点、原理以及在微服务中的应用场景&#xff0c;帮助读者更好地理解和使用这个优秀的远程调用工具。无论您是初学者还是有经验的开发人员&#xff0c;本文都将为您揭示Feign的秘密&#xff0c;并带您一起走进微服务的世…

人类与机器的不同交流特点

对人类而言&#xff0c;事实是用来交流的&#xff0c;价值是用来自我交流的。事实是用来交流的&#xff0c;是通过提供准确、可证实的信息来传递和共享知识的。事实具有客观性&#xff0c;不受个人主观意见的影响。通过分享事实&#xff0c;人们可以更好地理解世界和彼此&#…

Android挖取原图手指触点区域RectF(并框线标记)放大到ImageView宽高与矩阵mapRadius,Kotlin

Android挖取原图手指触点区域RectF(并框线标记)放大到ImageView宽高与矩阵mapRadius&#xff0c;Kotlin 这里 Android挖取原图中心区域RectF(并框线标记)放大到ImageView宽高&#xff0c;Kotlin-CSDN博客 实现的是把原图中心区域的一片小图挖取出来放大放到下面的ImageView里面…

if语句用法

if语句是单条件分支语句 定义&#xff1a;根据一个条件来控制程序执行流程(如图3.2)。 语法格式&#xff1a; if&#xff08;表达式&#xff09;{ 若干语句 } ★注意★&#xff1a; ① 表达式的值必须是boolean 型&#xff1b; ② 不能用0代表false&#xff1b;用1代表 true&am…

德人合科技 | —数据泄露可能会对公司造成哪些影响?

数据泄露可能会对公司造成多方面的影响&#xff0c;以下是一些可能的影响&#xff1a; 财务损失&#xff1a;数据泄露可能导致公司遭受财务损失。攻击者可能会盗取公司的敏感信息&#xff0c;如客户信息、银行账户信息、商业机密等&#xff0c;并利用这些信息进行欺诈、盗窃等非…

「优选算法刷题」:验证栈序列

一、题目 给定 pushed 和 popped 两个序列&#xff0c;每个序列中的 值都不重复&#xff0c;只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时&#xff0c;返回 true&#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a…

本地maven库缓存导入私库

为了加速编译代码&#xff0c;想将本地maven缓存导入内网私库使用。 脚本网上搜的 #!/bin/bash # copy and run this script to the root of the repository directory containing files # this script attempts to exclude uploading itself explicitly so the script name …

高效备考2024年AMC10:吃透2000-2023年1250道AMC10真题

距离2024年AMC10的比赛只有8个月多一点的时间了&#xff0c;如何备考AMC10美国数学竞赛最有效&#xff1f;参加AMC10竞赛是否一定要参加机构的培训班&#xff1f;吃透历年真题是有效的自学、了解AMC10和备考策略之一。事实上&#xff0c;网络上有很多关于AMC10的学习资源&#…

Github 2024-03-02 开源项目日报Top9

根据Github Trendings的统计&#xff0c;今日(2024-03-02统计)共有9个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量非开发语言项目2Rust项目1JavaScript项目1Shell项目1C项目1TypeScript项目1C#项目1Python项目1 任天堂Switch模…

InnoDB备份与恢复篇(4)-InnoDB的故障恢复与日志分析

在MySQL数据库中&#xff0c;InnoDB是一种非常常用的存储引擎。它提供了高性能和可靠性&#xff0c;同时也具备故障恢复和日志分析的能力。本文将介绍InnoDB的故障恢复机制和日志分析方法。 一、故障恢复机制 事务和写日志&#xff1a; 在InnoDB中&#xff0c;所有的数据操作都…

NIST网络安全框架2.0版发布:十年磨一剑,安全再升级

美国国家标准与技术研究院(NIST)近日发布了网络安全框架(CSF)的2.0正式版本&#xff0c;这是2014年该框架发布后十年来首次重大更新。新框架版本极大扩展了适用范围&#xff0c;重点关注治理和供应链问题&#xff0c;并提供了丰富的资源以加速框架实施。 NIST正式发布的网络安全…

决定西弗吉尼亚州地区版图的关键历史事件

决定西弗吉尼亚州地区版图的关键历史事件&#xff1a; 1. 内部分裂与美国内战&#xff1a; - 在1861年美国内战爆发时&#xff0c;弗吉尼亚州作为南方邦联的一员宣布退出美利坚合众国。然而&#xff0c;弗吉尼亚州西部的一些县由于经济结构&#xff08;主要是农业非依赖奴隶制…

使用Python进行Sentinel-2 图像聚类

聚类或无监督分类是根据统计相似性将图像的像素值分组或聚合到一定数量的自然类(组)的过程。在本教程中,我们将使用rasterio进行sentinel-2图像处理,并使用功能强大的完整scikit-learn python 包在jupyter Notebook中进行聚类。 Scikit-learn是一个用于 Python 编程语言的…