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

news2024/12/22 10:30:06
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,和其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;
    }
}

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

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

相关文章

图书推荐||Word文稿之美

让你的文档从平凡到出众&#xff01; 本书内容 《Word文稿之美》是一本全面介绍Word排版技巧和应用的实用指南。从初步认识数字排版到高效利用模板、图文配置和表格与图表的排版技巧&#xff0c;再到快速修正错误和保护文件&#xff0c;全面系统地讲解数字排版的技术和能力&…

多行业万能预约门店小程序源码系统 支持多门店预约小程序 带完整的安装代码包以及搭建教程

随着消费者对于服务体验要求的不断提升&#xff0c;门店预约系统成为了许多行业提升服务质量、提高运营效率的重要工具。然而&#xff0c;市面上的预约系统往往功能单一&#xff0c;无法满足多行业、多场景的个性化需求。下面&#xff0c;小编集合了多年的行业经验和技术积累&a…

Linux 安装k8s

官网 常见的三种安装k8s方式 1.kubeadm 2.kops&#xff1a;自动化集群制备工具 3.kubespray&#xff1a; 提供了 Ansible Playbook 下面以kubeadm安装k8s kubeadm的安装是通过使用动态链接的二进制文件完成的&#xff0c;目标系统需要提供 glibc ##使用 ss 或者 netstat 检测端…

基于Springboot的高校实习信息发布网站的设计与实现(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的高校实习信息发布网站的设计与实现&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xf…

jmeter如何请求访问https接口

添加线程组http请求 新建线程组&#xff0c;添加http请求 填入协议&#xff0c;ip&#xff0c;端口&#xff0c;请求类型&#xff0c;路径&#xff0c;以及请求参数&#xff0c;查看结果树等。 然后最关键的一步来了。 导入证书 步骤&#xff1a;获取证书&#xff0c;重新生…

Windows11家庭版安装Docker

文章目录 安装Docker安装hyper-v继续解决报错完成效果图进一步测试是否完成安装 安装Docker windows如何安装docker 装好之后&#xff0c;我打开报错。 安装hyper-v 按这个视频操作&#xff1a;Windows 11 家庭版安装 Hyper-V bat文件里的代码是&#xff1a; pushd "…

机器学习 | 模型性能评估

目录 一. 回归模型的性能评估1. 平均平方误差(MSE)2. 平均绝对误差(MAE)3. R 2 R^{2} R2 值3.1 R 2 R^{2} R2优点 二. 分类模型的性能评估1. 准确率&#xff08;Accuracy&#xff09;2. 召回率&#xff08;Recall&#xff09;3. 精确率&#xff08;Precision&#xff09;4. …

指针篇章-(1)

指针&#xff08;1&#xff09;学习流程 —————————————————————————————————————————————————————————————————————————————————————————————————————————————…

帝国cms7.5仿非小号区块链门户资讯网站源码 带手机版

帝国cms7.5仿非小号区块链门户资讯网站源码 带手机版 带自动采集 开发环境&#xff1a;帝国cms 7.5 安装环境&#xff1a;phpmysql 包含火车头采集规则和模块&#xff0c;采集目标站非小号官网。 专业的数字货币大数据平台模板&#xff0c;采用帝国cms7.5内核仿制&#xff0…

爱普生的SG2016系列高频,低相位抖动spxo样品

精工爱普生公司(TSE: 6724&#xff0c;“爱普生”)已经开始发货样品的新系列简单封装晶体振荡器(SPXO)与差分输出1。该系列包括SG2016EGN、SG2016EHN、SG2016VGN和SG2016VHN。它们在基本模式下都具有低相位抖动&#xff0c;并且采用尺寸为2.0 x 1.6 mm的小封装&#xff0c;高度…

【go从入门到精通】什么是go?为什么要选择go?

go的出生&#xff1a; go语言&#xff08;或Golang&#xff09;是Google开发的开源编程语言&#xff0c;诞生于2006年1月2日下午15点4分5秒&#xff0c;于2009年11月开源&#xff0c;2012年发布go稳定版。Go语言在多核并发上拥有原生的设计优势&#xff0c;Go语言从底层原生支持…

深度学习 精选笔记(10)简单案例:房价预测

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#x…

Maven【4】(继承)(命令行操作)

文章目录 【1】基础概念【2】继承的作用【3】创建父工程和子工程【4】在父工程中统一管理依赖 【1】基础概念 说到继承&#xff0c;我们很容易想到Java中的继承&#xff0c;有子类和父类&#xff0c;子类继承父类&#xff0c;那么我们maven中的继承是什么呢&#xff1f; Maven…

二分查找常用解题模板(带一道leetcode题目)

1.为了较为清晰的写出各种情况&#xff0c;接下来的代码中不会出现else&#xff0c;而是将每一个else if均给写出来!!! 2.为了防止每次的mid溢出&#xff0c;我们均写为mid left (right - left) 基本的二分查找模板&#xff08;寻找一个数&#xff09; 基本问题描述&#xff…

计算机网络物理层知识点总结

本篇博客是基于谢希仁编写的《计算机网络》和王道考研视频总结出来的知识点&#xff0c;本篇总结的主要知识点是第二章的物理层。上一章的传送门&#xff1a;计算机网络体系结构-CSDN博客 通信基础 物理层概念 物理层解决如何在连接各种计算机的传输媒体上传输数据比特流&am…

服务器上部署WEb服务方法

部署Web服务在服务器上是一个比较复杂的过程。这不仅仅涉及到配置环境、选择软件和设置端口&#xff0c;更有众多其它因素需要考虑。以下是在服务器上部署WEb服务的步骤&#xff1a; 1. 选择服务器&#xff1a;根据项目规模和预期访问量&#xff0c;选择合适的服务器类型和配置…

MySQL:函数

提醒&#xff1a; 设定下面的语句是在数据库名为 db_book里执行的。 创建user_info表 注意&#xff1a;pwd为密码字段&#xff0c;这里使用了VARCHAR(128)类型&#xff0c;为了后面方便对比&#xff0c;开发项目里一般使用char(32)&#xff0c;SQL语句里只有MD5加密函数 USE db…

iOS卡顿原因与优化

iOS卡顿原因与优化 1. 卡顿简介 卡顿&#xff1a; 指用户在使用过程中出现了一段时间的阻塞&#xff0c;使得用户在这一段时间内无法进行操作&#xff0c;屏幕上的内容也没有任何的变化。 卡顿作为App的重要性能指标&#xff0c;不仅影响着用户体验&#xff0c;更关系到用户留…

XUbuntu22.04之解决:仓库xxx没有数字签名问题(二百一十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

buuctf_misc_荷兰宽带数据泄露+被偷走的文件

荷兰宽带数据泄露 题目&#xff1a; 没啥&#xff0c;工具给大家放这了&#xff0c;这个&#xff08;相对来说&#xff09;比较安全 https://routerpassview.en.lo4d.com/windows 打开后&#xff0c;.bin文件直接托进去 只是我想不到的是&#xff0c;flag这算是username&…