LeetCode面试298,二叉树最长连续序列(Python)

news2024/11/24 8:01:40

开始想着dfs,两种情况

1.以root为根

2.不以root为根

但是这样需要两个dfs分别进行,那么时间复杂度就上去了。

class Solution:
    def longestConsecutive(self, root: Optional[TreeNode]) -> int:
        def dfs(root):
            # 以root为根节点,可以延续几个点
            ans = 1
            if root.left and root.left.val - root.val == 1:
                ans = max(ans, 1+dfs(root.left))
            if root.right and root.right.val - root.val == 1:
                ans = max(ans, 1+dfs(root.right))
            return ans
        if not root: return 0
        ans = dfs(root)
        ans = max(ans, self.longestConsecutive(root.left), self.longestConsecutive(root.right))
        return ans

题解中提出一种思路可以同时进行dfs,只用把所有节点遍历一遍。

从上到下遍历,建立一个dfs(u, v, length),u为v的父节点,v为u的子节点,length以父节点为最后一个节点的序列长度(初始长度为1)

如果子节点刚好比父节点大1,那么length + 1,反之,length = 1

再继续遍历v的子节点

class Solution:
    def __init__(self):
        self.m = 1

    def longestConsecutive(self, root: Optional[TreeNode]) -> int:
        self.dfs(root, root, 1)
        return self.m

    def dfs(self, u, v, length):
        # u为父节点,v为子节点,length为初始长度
        if not v: return 
        if v.val - u.val == 1:
            length += 1
            self.m = max(self.m, length)
        else:
            length = 1
        self.dfs(v, v.left, length)
        self.dfs(v, v.right, length)

举一反三,还是按照之前的想法,不过只需要改变一点点,只有一种情况:

以root为根的最长序列

如果root.left.val - root.val==1,那么(以root为根的最长序列)可能就等于(以root.left为根的最长序列+1),如果root.right.val - root.val==1,那么(以root为根的最长序列)可能就等于(以root.right为根的最长序列+1),如果都不满足,那么返回1。

怎么有点像列表维护最长序列。其实就可以将链表想象成多方向的列表。

class Solution:
    def __init__(self):
        self.m = 1

    def longestConsecutive(self, root: Optional[TreeNode]) -> int:
        self.dfs(root)
        return self.m

    def dfs(self, root):
        if not root:return
        l, r = self.dfs(root.left), self.dfs(root.right)
        if root.left and root.left.val - root.val == 1:
            l += 1
            self.m = max(self.m, l)
        else:
            l = 0
        if root.right and root.right.val - root.val == 1:
            r += 1
            self.m = max(self.m, r)
        else:
            r = 0
        return max(1, l, r)

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

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

相关文章

递归与递推---题目练习

目录 1、递归实现指数型枚举 2、递归实现排列型枚举 3、递归实现组合型枚举 4、带分数 方法一 方法二 5、翻硬币 6、飞行员兄弟 7、费解的开关 递归是指在函数的定义中使用函数自身的方法。它通过不断地将问题分解为更小的子问题,直到达到基本情况&#xf…

【Gaea+UE5】创建基本的大型世界场景

目录 效果 步骤 一、在Gaea中生成地形 二、确定导出的地形规模 三、在UE中创建地形 四、验证UE创建的地形规模是否正确 五、使用M4自动地形材质 效果 步骤 一、在Gaea中生成地形 1. 打开Gaea官网下载软件 2. 打开Gaea软件,我们可以选择一个预设的山体 创…

机器学习——4.案例: 简单线性回归求解

案例目的 寻找一个良好的函数表达式,该函数表达式能够很好的描述上面数据点的分布,即对上面数据点进行拟合。 求解逻辑步骤 使用Sklearn生成数据集定义线性模型定义损失函数定义优化器定义模型训练方法(正向传播、计算损失、反向传播、梯度清空&#…

Implicit Diffusion Models for Continuous Super-Resolution

CVPR2023https://github.com/Ree1s/IDM问题引入: – LIIF方法可以实现任意分辨率的输出,但是因为是regression-based方法,所以得到的结果缺少细节,而生成的方法(gan-based,flow-based,diffusion-based等)可以生成细节&…

JavaScript中的RegExp和Cookie

个人主页:学习前端的小z 个人专栏:JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 🔆RegExp 🎲 1 什么是正则表达式 🎲2 创建…

从招标到合作:如何筛选与企业需求匹配的6sigma咨询公司

在市场竞争激烈的环境中,领军企业需要不断改进和创新才能在行业中保持竞争优势。为了解决产品质量、生产流程和客户满意度等方面的挑战,许多企业选择与6sigma咨询公司合作,推动企业的全面变革和持续发展。下面是企业在选择合作伙伴时通常会经…

一、Redis五种常用数据类型

Redis优势: 1、性能高—基于内存实现数据的存储 2、丰富的数据类型 5种常用,3种高级 3、原子—redis的所有单个操作都是原子性,即要么成功,要么失败。其多个操作也支持采用事务的方式实现原子性。 Redis特点: 1、支持…

Golang日志实战教程:掌握log与syslog库的高效使用

Golang日志实战教程:掌握log与syslog库的高效使用 简介理解 Golang 的 log 库基本概念创建日志记录器自定义日志记录器日志级别 深入 syslogsyslog 的基础配置和使用 syslog高级应用 日志格式化与管理日志格式化日志文件管理 日志的高级应用集成第三方日志框架使用 …

Python程序中温度更新出现振荡问题的分析和解决方案

在处理温度更新出现振荡问题时,可以考虑以下分析和解决方案:检查温度更新算法是否正确,可能存在错误导致振荡。检查温度更新的步长(时间步长)是否合适,步长过大可能导致振荡。检查系统动力学模型是否准确&a…

场外个股期权和场内个股期权的优缺点是什么?

场外个股期权和场内个股期权的优缺点 场外个股期权是指在沪深交易所之外交易的个股期权,其本质是一种金融衍生品,允许投资者在股票交易场所外以特定价格买进或卖出证券。场内个股期权是以单只股票作为标的资产的期权合约,其内在价值是基于标…

如何用Kimi,5秒1步生成流程图

引言 在当前快节奏的工作环境中,拥有快速、专业且高效的工具不可或缺。 Kimi不仅能在5秒内生成专业的流程图(kimi),还允许实时编辑和预览,大幅简化了传统流程图的制作过程。 这种迅速的生成能力和高度的可定制性使得…

员工账号生命周期如何“全场景”自动化管理?

当企业在信息化建设中引入越来越多的业务系统时,必然存在系统内账号互相独立、无法打通的情况。一有人事变动,HR、IT 管理员、应用管理员、业务部门主管等人就需要在系统里手动更新账号状态。重复、低效,且不可避免出现安全隐患。困扰着 IT 管…

冯喜运:5.7全球紧张局势中,黄金原油投资者转向需谨慎

【黄金消息面分析】:周一(5月6日),现货黄金触底回升,盘中交投于2320美元附近。自美国4月非农就业数据出炉和美联储主席鲍威尔货币政策新闻发布会以后,现货黄金从4月12日的历史高点2431美元下跌了大约6.3%&a…

AI口语对话训练有哪些软件?推荐这5款,简单易用

AI口语对话训练有哪些软件?AI口语对话训练软件在近年来得到了飞速的发展,为语言学习者提供了更为便捷、高效的学习方式。它们借助先进的自然语言处理技术和机器学习算法,不仅模拟了真实对话场景,还提供了个性化的学习建议和即时反…

笔试强训Day15 二分 图论

平方数 题目链接&#xff1a;平方数 (nowcoder.com) 思路&#xff1a;水题直接过。 AC code&#xff1a; #include<iostream> #include<cmath> using namespace std; int main() {long long int n; cin >> n;long long int a sqrtl(n);long long int b …

苏州金龙荣获首届无人扫地机器人演示比赛“竞技领跑奖”

4月30日&#xff0c;2024年苏州市首届无人扫地机器人演示比赛在高新区思益街展开比拼。五家企业参赛在道路上实地比拼无人扫地机器人技术&#xff0c;通过清扫垃圾、识别路障等环节展现城市清洁的“未来场景”。经过角逐&#xff0c;苏州金龙的无人驾驶清扫车获得步道演示比赛“…

送给正在入行的小白:最全最有用的网络安全学习路线已经安排上了

在这个圈子技术门类中&#xff0c;工作岗位主要有以下三个方向&#xff1a; 安全研发安全研究&#xff1a;二进制方向安全研究&#xff1a;网络渗透方向 下面逐一说明一下。 第一个方向&#xff1a;安全研发 你可以把网络安全理解成电商行业、教育行业等其他行业一样&#xf…

centos7.9系统rabbitmq3.8.5升级为3.8.35版本

说明 本文仅适用rabbitmq为RPM安装方式。 升级准备 查看环境当前版本&#xff1a; # cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) # rabbitmqctl status Status of node rabbitmq01 ... RuntimeOS PID: 19333 OS: Linux Uptime (seconds): 58 Is under …

Ollama +Docker+OpenWebUI

1 Ollama 1.1 下载Ollama https://ollama.com/download 1.2 运行llama3 $ ollama run llama3 pulling manifest pulling 00e1317cbf74... 100% ▕███████████████████████████████████████████████████████████…

Java 运行的底层原理

Java是一种跨平台的编程语言&#xff0c;其底层原理涉及到了多个方面&#xff0c;包括Java虚拟机&#xff08;JVM&#xff09;、字节码、类加载机制、垃圾回收器等。让我们逐一深入了解Java运行的底层原理。 1. Java虚拟机&#xff08;JVM&#xff09; Java虚拟机是Java程序运…