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,和其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;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcode刷题(javaScript)——链表相关场景题总结

链表中的元素在内存中不是顺序存储的&#xff0c;而是通过next指针联系在一起的。常见的链表有单向链表、双向链表、环形链表等 在 JavaScript 刷题中涉及链表的算法有很多&#xff0c;常见的包括&#xff1a; 1. 遍历链表&#xff1a;从头到尾遍历链表&#xff0c;处理每个节点…

08、关于语法:resp?.data?.data 的含义与实际操作中可能遇到的问题

1、数据情况&#xff1a; 其一、从后端拿到的数据为&#xff1a; let resp.data {"data": [],"lag_mode": 3,"totol": 0 }或&#xff1a; let resp.data {"data": [],"totol": 0 }其二、目标数据为&#xff1a; // 想要…

1小时网络安全事件报告要求,持安零信任如何帮助用户应急响应?

12月8日&#xff0c;国家网信办起草发布了《网络安全事件报告管理办法&#xff08;征求意见稿&#xff09;》&#xff08;以下简称“办法”&#xff09;。拟规定运营者在发生网络安全事件时应当及时启动应急预案进行处置。 1小时报告 按照《网络安全事件分级指南》&#xff0c…

命令行启动mongodb服务器的问题及解决方案 -- Unrecognized option: storage.journal

目录 mongodb命令行启动问题 -- Unrecognized option: storage.journal问题日志&#xff1a;问题截图&#xff1a;问题来源&#xff1a;错误原因&#xff1a;解决方式&#xff1a; mongodb命令行启动问题 – Unrecognized option: storage.journal 同样是格式出问题的问题分析和…

ThreadLocal 为什么会内存泄漏吗?是怎么产生的?

ThreadLocal是什么 ThreadLocalMap 如何避免泄漏 ThreadLocal是什么 ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射&#xff0c;各个线程之间的变量互不干扰&#xff0c;在高并发场景下&#xff0c;可以实现无状态的调用&…

WPF 滑动条样式

效果图&#xff1a; 浅色&#xff1a; 深色&#xff1a; 滑动条部分代码&#xff1a; <Style x:Key"RepeatButtonTransparent" TargetType"{x:Type RepeatButton}"><Setter Property"OverridesDefaultStyle" Value"true"/&g…

[攻防世界]-Web:fileinclude解析(文件包含,添加后缀)

查看网页 查看源代码 意思就是&#xff0c;如果变量lan被设置就会触发文件包含。 但是要注意&#xff0c;这里的文件包含会自动加上后缀&#xff0c;所以payload要注意一点 payload&#xff1a; languagephp://filter/readconvert.base64-encode/resourceflag

基带信号处理设计原理图:2-基于6U VPX的双TMS320C6678+Xilinx FPGA K7 XC7K420T的图像信号处理板

基于6U VPX的双TMS320C6678Xilinx FPGA K7 XC7K420T的图像信号处理板 综合图像处理硬件平台包括图像信号处理板2块&#xff0c;视频处理板1块&#xff0c;主控板1块&#xff0c;电源板1块&#xff0c;VPX背板1块。 一、板卡概述 图像信号处理板包括2片TI 多核DSP处理…

考取ORACLE数据库OCP的必要性 Oracle数据库

OCP证书是什么&#xff1f; OCP&#xff0c;全称Oracle Certified Professional&#xff0c;是Oracle公司的Oracle数据库DBA&#xff08;Database Administrator&#xff0c;数据库管理员)认证课程。这是Oracle公司针对数据库管理领域设立的一项认证课程&#xff0c;旨在评估和…

(Sora模型风口)2024最新GPT4.0使用教程,AI绘画,一站式解决

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画&#xff0c;文档对话总结DALL-E3文生图&#xff0c;相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚至也可以和…

云上攻防-云原生篇Docker安全权限环境检测容器逃逸特权模式危险挂载

知识点: 1、云原生-Docker安全-容器逃逸&特权模式 2、云原生-Docker安全-容器逃逸&挂载Procfs 3、云原生-Docker安全-容器逃逸&挂载Socket 4、云原生-Docker安全-容器逃逸条件&权限高低 章节点&#xff1a; 云场景攻防&#xff1a;公有云&#xff0c;私有云&…

GIT分支管理与远程操作

文章目录 10.分支操作-分支介绍(掌握)目标内容小结 11.分支操作-分支创建与切换目标内容小结 12.分支操作-分支合并与删除目标内容小结 13.GIT远程仓库介绍与码云仓库注册创建目标内容小结 14.GIT远程仓库操作-关联、拉取、推送、克隆(不用刻意记住命令)目标内容小结 10.分支操…

Zynq—AD9238数据采集DDR3缓存千兆以太网发送实验(一)

Zynq—AD9238数据采集DDR3缓存千兆以太网发送实验&#xff08;前导&#xff09; 四、AXI转FIFO接口模块设计 1.AXI接口知识 AXI协议是基于 burst的传输&#xff0c;并且定义了以下 5 个独立的传输通道&#xff1a; 读地址通道&#xff08;Read Address Channel&#xff0c; …

python统计分析——广义线性模型的评估

参考资料&#xff1a;用python动手学统计学 残差是表现数据与模型不契合的程度的重要指标。 1、导入库 # 导入库 # 用于数值计算的库 import numpy as np import pandas as pd import scipy as sp from scipy import stats # 导入绘图的库 import matplotlib.pyplot as plt i…

加密与安全_探索非对称加密算法_RSA算法

文章目录 Pre主流的非对称加密算法典型算法&#xff1a;RSACodeRSA的公钥和私钥的恢复小结 Pre 加密与安全_探索密钥交换算法&#xff08;Diffie-Hellman算法&#xff09; 中我们可以看到&#xff0c;公钥-私钥组成的密钥对是非常有用的加密方式&#xff0c;因为公钥是可以公开…

【Vue】npm run build 打包报错:请在[.env.local]中填入key后方可使用...

报错如下 根目录添加 .env.local 文件 .env.local &#xff1a;本地运行下的配置文件 配置&#xff1a;VUE_GITHUB_USER_NAME 及 VUE_APP_SECRET_KEY 原因

通过GitHub探索Python爬虫技术

1.检索爬取内容案例。 2.找到最近更新的。(最新一般都可以直接运行) 3.选择适合自己的项目&#xff0c;目前测试下面画红圈的是可行的。 4.方便大家查看就把代码粘贴出来了。 #图中画圈一代码 import requests import os import rewhile True:music_id input("请输入歌曲…

文本多分类

还在用BERT做文本分类&#xff1f;分享一套基于预训练模型ERNIR3.0的文本多分类全流程实例【文本分类】_ernir 文本分类-CSDN博客 /usr/bin/python3 -m pip install --upgrade pip python3-c"import platform;print(platform.architecture()[0]);print(platform.machine…

Mysql主从备份

主从复制概述 将主服务器的binlog日志复制到从服务器上执行一遍&#xff0c;达到主从数据的一致状态&#xff0c;称之为主从复制。一句话表示就是&#xff0c;主数据库做什么&#xff0c;从数据库就跟着做什么。 为什么要使用主从复制 为实现服务器负载均衡/读写分离做铺垫&…

Chrome插件 | WEB 网页数据采集和爬虫程序

无边无形的互联网遍地是数据&#xff0c;品类丰富、格式繁多&#xff0c;包罗万象。数据采集&#xff0c;或说抓取&#xff0c;就是把分散各处的内容&#xff0c;通过各种方式汇聚一堂&#xff0c;是个有讲究要思考的体力活。君子爱数&#xff0c;取之有道&#xff0c;得注意遵…