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…

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…

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;并利用这些信息进行欺诈、盗窃等非…

本地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模…

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

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

Redis 存储原理和数据模型

redis 是不是单线程 redis 单线程指的是命令处理在一个单线程中。主线程 redis-server&#xff1a;命令处理、网络事件的监听。 辅助线程 bio_close_file&#xff1a;异步关闭大文件。bio_aof_fsync&#xff1a;异步 aof 刷盘。bio_lazy_free&#xff1a;异步清理大块内存。io_…

一种基于三角剖分划分白区范围的白平衡算法

常规的白平衡算法中,一般会通过标准色温的R/G-B/G建议色温坐标系,然后在该坐标系中设定白区范围,对落入到白区范围的R/G/B进行加权统计处理,输出给到软件进行白平衡的增益计算。 所介绍的这篇专利利用三角剖分的算法,在划定的白区范围内,利用各个标准色温光源下所标定的白…

STM32------分析GPIO寄存器

一、初始LED原理图 共阴极led LED发光二极管&#xff0c;需要有电流通过才能点亮&#xff0c;当有电压差就会产生电流 二极管两端的电压差超过2.7v就会有电流通过 电阻的作用 由于公式IV/R 不加电阻容易造成瞬间电流无穷大 发光二极管工作电流为10-20MA 3.3v / 1kΩ 3.…

C#中什么是非托管代码?托管代码和非托管代码有什么区别

在C#中&#xff0c;托管代码和非托管代码是两种不同类型的代码&#xff0c;它们在内存管理和执行环境上有所不同。 托管代码&#xff08;Managed Code&#xff09;&#xff1a; 托管代码是由.NET运行时&#xff08;CLR&#xff0c;Common Language Runtime&#xff09;管理和执…

新能源汽车产业架构设计与实现:引领未来出行新风向

随着环保意识的增强和能源结构的转型&#xff0c;新能源汽车产业正迅速崛起成为汽车行业的新宠。构建一个完善的新能源汽车产业架构对于推动产业发展、提升竞争力至关重要。本文将从设计原则、关键技术、产业生态等方面&#xff0c;探讨如何设计与实现新能源汽车产业架构。 ##…

那些壁纸,不只是背景

1、方小童在线工具集 网址&#xff1a; 方小童 该网站是一款在线工具集合的网站&#xff0c;目前包含PDF文件在线转换、随机生成美女图片、精美壁纸、电子书搜索等功能&#xff0c;喜欢的可以赶紧去试试&#xff01;

【快速选择】解决TopK问题

目录 一、什么是TopK问题 二、优先级队列 优先级队列介绍 代码实现 三、使用优先级队列解决TopK问题 四、快速选择算法解决TopK问题 快速选择 图解快速选择 代码解决前k小个元素 五、优先级队列与快速选则算法比较 优先级队列 快速选择 一、什么是TopK问题 TopK问题…

Linux Seccomp 简介

文章目录 一、简介二、架构三、Original/Strict Mode四、Seccomp-bpf五、seccomp系统调用六、Linux Capabilities and Seccomp6.1 Linux Capabilities6.2 Linux Seccomp 参考资料 一、简介 Seccomp&#xff08;secure computing&#xff09;是Linux内核中的一项计算机安全功能…

软考 系统分析师系列知识点之需求获取(7)

所属章节&#xff1a; 第11章. 软件需求工程 第2节. 需求获取 需求获取是一个确定和理解不同的项目干系人的需求和约束的过程。需求获取是一件看上去很简单、做起来却很难的事情。需求获取是否科学、准备是否充分&#xff0c;对获取出来的结果影响很大&#xff0c;这是因为大部…

Leetcode刷题(十八)

一、203. 移除链表元素 代码&#xff1a; class Solution:def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:while head and head.val val:head head.nextpre, cur head, headwhile cur:if cur.val val:pre.next cur.nextelse:p…

全闪存加速信创数据库数仓一体机解决方案

立足行业&#xff0c;深度解读 在新的大数据生态中&#xff0c;传统数据库/数据仓库技术和产品成为大数据生态中的组成部分&#xff0c;对结构化数据的存储和计算进行支撑。 数据库&数据仓库一体机是高端、核心数据管理产品&#xff0c;在我国党政、银行、交通等领域广泛…