leetcode437 路径总和III-哈希表+前缀和

题目

给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。

路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

示例

输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8
输出:3
解释:和等于 8 的路径有 3 条,如图所示。
在这里插入图片描述

解析

这道题单单使用dfs的方法的话,基本上还是可以想到思路的:

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func pathSum(root *TreeNode, targetSum int) int {
	if root == nil {
		return 0
	}
	res := rootSum(root, targetSum)
	res += pathSum(root.Left, targetSum)
	res += pathSum(root.Right, targetSum)
	return res
}

func rootSum(root *TreeNode, targetSum int) int {
	res := 0
	if root == nil {
		return res
	}

	if root.Val == targetSum {
		res++
	}
	res += rootSum(root.Left, targetSum-root.Val)
	res += rootSum(root.Right, targetSum-root.Val)
	return res
}

然后实际上,这道题最好的解法是哈希表+前缀和的思路:
在二叉树上,前缀和相当于从根节点开始的路径元素和。用哈希表 cnt 统计前缀和的出现次数,当我们递归到节点 node时,设从根到 node 的路径元素和为 s,那么就找到了 cnt[s−targetSum]个符合要求的路径,加入答案。
在其中的恢复现场部分:如果不恢复现场,当我们递归完左子树,要递归右子树时,cnt中还保存着左子树的数据。但递归到右子树,要计算的路径并不涉及到左子树的任何节点,如果不恢复现场,cnt中统计的前缀和个数会更多,我们算出来的答案可能比正确答案更大。

func pathSum(root *TreeNode, targetSum int) (ans int) {
	cnt := map[int]int{0: 1} // 01是防止包含根节点的时候找不到
	var dfs func(*TreeNode, int)
	dfs = func(node *TreeNode, s int) {
		if node == nil {
			return
		}
		// 判断是否存在符合条件的前缀和
		s += node.Val
		ans += cnt[s-targetSum]
		// 将当前前缀和记录下来
		cnt[s]++
		// 继续向下递归
		dfs(node.Left, s)
		dfs(node.Right, s)
		// 回溯,恢复状态
		cnt[s]--
		return
	}
	dfs(root, 0)
	return
}

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

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

相关文章

服务器数据恢复—EVA存储多块硬盘离线导致部分LUN丢失的数据恢复案例

服务器数据恢复环境: 1台某品牌EVA4400控制器3台EVA4400扩展柜28块FC硬盘。 服务器故障: 由于两块磁盘掉线导致存储中某些LUN不可用,某些LUN丢失,导致存储崩溃。 服务器数据恢复过程: 1、由于EVA4400存储故障是某些磁…

Web API——获取DOM元素

目录 1、根据选择器来获取DOM元素 2.、根据选择器来获取DOM元素伪数组 3、根据id获取一个元素 4、通过标签类型名获取所有该标签的元素 5、通过类名获取元素 目标:能查找/获取DOM对象 1、根据选择器来获取DOM元素 语法: document.querySelector(css选择…

python从0开始学习(十二)

目录 前言 1、字符串的常用操作 2、字符串的格式化 2.1 格式化字符串的详细格式(针对format形式) ​编辑 总结 前言 上一篇文章我们讲解了两道关于组合数据类型的题目,本篇文章我们将学习新的章节,学习字符串及正则表达式。 …

C++|红黑树(分析+模拟实现插入)

目录 一、概念 二、红黑树插入的实现 2.1红黑树节点的定义 2.2红黑树基础架构 2.3红黑树的插入 2.3.1按照二叉搜索树的规则插入新结点 2.3.2检测新插入节点,是否破坏红黑树性质来进行调整 2.3.2.1cur为红,p为红,g为黑,u存…

好用的桌面备忘录是哪个?备忘录软件哪个更好用?

备忘录软件已成为我们日常生活和工作中不可或缺的工具,它能帮助我们记录重要事项、安排日程,从而提高工作效率,减少遗忘。在繁忙的工作和生活中,一款好用的备忘录软件往往能让我们事半功倍。 在众多的备忘录软件中,敬…

Jenkins 构建 Web 项目:构建服务器和部署服务器分离的情况

构建命令 #!/bin/bash node -v pnpm -v pnpm install pnpm build:prod # 将dist打包成dist.zip zip -r dist.zip dist

2024年艺术鉴赏与文化传播国际会议(AACC 2024)

2024年艺术鉴赏与文化传播国际会议(AACC 2024) 2024 International Conference on Art Appreciation and Cultural Communication 【重要信息】 大会地点:贵阳 大会官网:http://www.icaacc.com 投稿邮箱:icaaccsub-co…

VS QT 里头文件的<>和““的区别

今天在跑项目的时候遇到这么个问题,在添加api宏定义的时候,不加显示无法识别的外部错误,加了显示找不到文件。反正就是怎么都是错的,但是我检查了CmakeLists、模块所在文件夹、项目路径都是没有问题的。非常奇怪。 然后就开始尝试…

一阶数字高通滤波器

本文的主要内容包含一阶高通滤波器公式的推导和数字算法的实现以及编程和仿真 1 计算公式推导 1.1.2 算法实现及仿真 利用python实现的代码如下: import numpy as np # from scipy.signal import butter, lfilter, freqz import matplotlib.pyplot as plt #2pifW…

【LeetCode 随笔】面试经典 150 题【中等+困难】持续更新中。。。

文章目录 380.【中等】O(1) 时间插入、删除和获取随机元素238.【中等】除自身以外数组的乘积134.【中等】 加油站135.【困难】分发糖果42.【困难】接雨水 🌈你好呀!我是 山顶风景独好 💝欢迎来到我的博客,很高兴能够在这里和您见面…

matlab使用教程(80)—修改图形对象的透明度

1.更改图像、填充或曲面的透明度 此示例说明如何修改图像、填充或曲面的透明度。 1.1坐标区框中所有对象的透明度 透明度值称为 alpha 值。使用 alpha 函数设置当前坐标区范围内所有图像、填充或曲面对象的透明度。指定一个介于 0(完全透明)和 1&#x…

第19讲:自定义类型:结构体

目录 1.结构体类型的声明1.1 结构体回顾1.1.1 结构的声明 特殊的结构声明1.3 结构的⾃引⽤ 2. 结构体内存的对齐2.2 为什么存在内存对⻬?2.3 修改默认对⻬数 3. 结构体传参4. 结构体实现位段4.1 什么是位段4.2 位段的内存分配4.3 位段的跨平台问题4.5 位段使⽤的注意事项 正文…

目标检测——无人机垃圾数据集

引言 亲爱的读者们,您是否在寻找某个特定的数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。 …

【ONE·MySQL || 事务】

总言 主要内容:介绍事务。理解事务概念(为什么存在),理解事务的四种属性(原子性、持久性、隔离性、一致性),理解事务的隔离级别(四种隔离级别,读写并发说明)。…

Java zip解压时候 malformed input off : 0, length : 1

public static void unzip(String zipFilePath, String destDirectory) {File dir new File(destDirectory);// 如果目标文件夹不存在,则创建if (!dir.exists()) {dir.mkdirs();}byte[] buffer new byte[1024];try (ZipInputStream zis new ZipInputStream(new F…

C++小病毒

C小病毒&#xff08;注&#xff1a;对电脑无过大伤害&#xff09; 短短行&#xff0c;创造奇迹&#xff01; 把这个文件命名为virus.exe就可以使用了。 #include<bits/stdc.h> #include<windows.h> using namespace std; int main() {HWND hwnd GetForegroundW…

梳理 JavaScript 中空数组调用 every方法返回true 带来惊讶的问题

前言 人生总是在意外之中. 情况大概是这样的. 前两天版本上线以后, 无意中发现了一个bug, 虽然不是很大, 为了不让用户使用时感觉到问题. 还是对着一个小小的bug进行了修复, 并重新在上线一次, 虽然问题不大, 但带来的时间成本还是存在的. 以及上线后用户体验并不是很好. 问题…

OpenFeign微服务调用组件使用

前言&#xff1a;OpenFeign是可以跨服务、跨进程的调用方式。 什么是Feign Feign是Netflix开发的声明式、模版化的HTTP客户端。 优势: Feign可以做到使用 HTTP 请求远程服务时就像调用本地方法一样的体验&#xff0c;开发者完全感知不到这是远程方法&#xff0c;更感知不到这…

一个典型的分布式缓存系统是什么样的?no.32

分布式 Redis 服务 由于本课程聚焦于缓存&#xff0c;接下来&#xff0c;我将以微博内的 分布式 Redis 服务系统为例&#xff0c;介绍一个典型的分布式缓存系统的组成。 微博的 Redis 服务内部也称为 RedisService。RedisService 的整体架构如图所示。主要分为Proxy、存储、集…

使用第三方的PyCharm开发工具

目录 PyCharm下载 PyCharm安装 运行PyCharm 创建工程目录 编写“hello world”程序 在同一个工程下创建多个程序文件 运行程序的多种方法 保存程序 关闭程序或工程 删除程序 打开最近的工程 调试断点 熟悉PyCharm开发环境 设置Python解析器 输出彩色控制台文字及…