谷歌(Google)技术面试——在线评估问题(三)

谷歌(Google)面试过程的第一步,你可能会收到一个在线评估链接。 评估有效期为 7 天,包含两个编码问题,需要在一小时内完成。 以下是一些供你练习的在线评估问题

在本章结尾处,还提供了有关 Google 面试不同阶段的更多详细信息。

最长同值路径

给定一个二叉树的 root ,返回 最长的路径的长度 ,这个路径中的 每个节点具有相同值 。 这条路径可以经过也可以不经过根节点。

两个节点之间的路径长度 由它们之间的边数表示。

示例 1:
在这里插入图片描述

输入:root = [5,4,5,1,1,5]
输出:2

示例 2:
在这里插入图片描述

输入:root = [1,4,5,4,4,5]
输出:2

提示:

  • 树的节点数的范围是 [0, 104]
  • -1000 <= Node.val <= 1000
  • 树的深度将不超过 1000

思路一:递归

首先,我们可以使用递归来解决这个问题。具体来说,对于每个节点,递归计算其左右子树中与当前节点值相同的路径的长度,然后返回左右子树中较长的路径长度加上当前节点的路径长度。这样就可以得到以当前节点为根节点的最长路径长度。在递归的过程中,可以用一个全局变量来记录最长的路径长度。

代码示例1

class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightclass Solution:def longestUnivaluePath(self, root):self.max_length = 0def dfs(node):if not node:return 0left_length = dfs(node.left)right_length = dfs(node.right)left_arrow = right_arrow = 0if node.left and node.left.val == node.val:left_arrow = left_length + 1if node.right and node.right.val == node.val:right_arrow = right_length + 1self.max_length = max(self.max_length, left_arrow + right_arrow)return max(left_arrow, right_arrow)dfs(root)return self.max_length# 示例 1
root1 = TreeNode(5)
root1.left = TreeNode(4)
root1.right = TreeNode(5)
root1.left.left = TreeNode(1)
root1.left.right = TreeNode(1)
root1.right.right = TreeNode(5)
print(Solution().longestUnivaluePath(root1)) # 输出:2# 示例 2
root2 = TreeNode(1)
root2.left = TreeNode(4)
root2.right = TreeNode(5)
root2.left.left = TreeNode(4)
root2.left.right = TreeNode(4)
root2.right.right = TreeNode(5)
print(Solution().longestUnivaluePath(root2)) # 输出:2

这个解决方案使用了一个嵌套的辅助函数 dfs() 来递归地计算每个节点的最长路径长度。在递归的过程中,如果当前节点的值与其左子节点值或右子节点值相等,则可以从左右子树中延伸路径。然后将左右子树中较长的路径长度加上当前节点的路径长度,得到以当前节点为根节点的最长路径长度,并更新全局变量 max_length

思路二:深度优先搜索(DFS)

第二种解决这个问题的方法是使用深度优先搜索(DFS),但稍微修改一下递归函数的返回值。在这种方法中,递归函数返回一个元组 (path_length, arrow_length),其中 path_length 表示以当前节点为根的最长路径长度,而 arrow_length 表示从当前节点出发向左或向右延伸的最长箭头长度。然后通过不断更新全局变量 max_length 来计算最终的结果。

代码示例2

class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightclass Solution:def longestUnivaluePath(self, root):self.max_length = 0def dfs(node):if not node:return 0, 0left_length, left_arrow = dfs(node.left)right_length, right_arrow = dfs(node.right)left_path = right_path = 0if node.left and node.left.val == node.val:left_path = left_length + 1if node.right and node.right.val == node.val:right_path = right_length + 1path_length = left_path + right_patharrow_length = max(left_path, right_path)self.max_length = max(self.max_length, path_length)return path_length, arrow_lengthdfs(root)return self.max_length# 示例 1
root1 = TreeNode(5)
root1.left = TreeNode(4)
root1.right = TreeNode(5)
root1.left.left = TreeNode(1)
root1.left.right = TreeNode(1)
root1.right.right = TreeNode(5)
print(Solution().longestUnivaluePath(root1)) # 输出:2# 示例 2
root2 = TreeNode(1)
root2.left = TreeNode(4)
root2.right = TreeNode(5)
root2.left.left = TreeNode(4)
root2.left.right = TreeNode(4)
root2.right.right = TreeNode(5)
print(Solution().longestUnivaluePath(root2)) # 输出:2

在这个解决方案中,递归函数 dfs() 返回一个元组 (path_length, arrow_length),表示以当前节点为根的最长路径长度和从当前节点向左或向右延伸的最长箭头长度。在递归的过程中,通过更新全局变量 max_length 来计算最终结果。

思路三:广度优先搜索(BFS)

第三种解题思路是使用广度优先搜索(BFS),通过遍历树中的每个节点来计算最长路径。在每一步中,记录当前节点的值以及从根节点到该节点的路径长度。如果当前节点的值与其父节点的值相同,则更新当前节点的路径长度为父节点的路径长度加1,否则将当前节点的路径长度重置为1。然后根据当前节点的路径长度更新最长路径的值。这种方法遍历了树中的每个节点,时间复杂度较高,但在一些情况下可能是一种简单直观的解决方案。

代码示例3

class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightclass Solution:def longestUnivaluePath(self, root):if not root:return 0queue = [(root, 1)]  # 使用队列存储节点及其路径长度max_length = 0while queue:node, length = queue.pop(0)max_length = max(max_length, length)if node.left:if node.left.val == node.val:queue.append((node.left, length + 1))else:queue.append((node.left, 1))if node.right:if node.right.val == node.val:queue.append((node.right, length + 1))else:queue.append((node.right, 1))return max_length# 示例 1
root1 = TreeNode(5)
root1.left = TreeNode(4)
root1.right = TreeNode(5)
root1.left.left = TreeNode(1)
root1.left.right = TreeNode(1)
root1.right.right = TreeNode(5)
print(Solution().longestUnivaluePath(root1)) # 输出:2# 示例 2
root2 = TreeNode(1)
root2.left = TreeNode(4)
root2.right = TreeNode(5)
root2.left.left = TreeNode(4)
root2.left.right = TreeNode(4)
root2.right.right = TreeNode(5)
print(Solution().longestUnivaluePath(root2)) # 输出:2

这个解法利用了 BFS 遍历树的每个节点,并在遍历过程中记录当前节点的值以及从根节点到该节点的路径长度。如果当前节点的值与其父节点的值相同,则更新当前节点的路径长度为父节点的路径长度加1,否则将当前节点的路径长度重置为1。最后根据当前节点的路径长度更新最长路径的值。

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

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

相关文章

进销存管理系统:食品批发零售迈向数字化未来-亿发

随着消费逐步复苏&#xff0c;食品批发零售行业也迎来了客流的回升&#xff0c;实体店重新焕发了生机。然而&#xff0c;随着数字化时代的来临&#xff0c;传统的食品批发零售企业面临着新的挑战和机遇。些企业正积极实施数字化转型&#xff0c;通过布局线上线下多业态的融合发…

设计模式:单例模式六种实现

单例模式有多种实现方式,每种方式都有其设计思想、优缺点以及适用的使用场景。以下是一些常见的单例实现方式: 1. 懒汉式(线程不安全) 设计思想 这种实现方式采用了类加载的懒加载机制来保证单例只在第一次使用时被创建。 实现代码 public class Singleton {private s…

分布式事务之Seata使用

分布式事务解决方案之Seata Seata的概念 Seata是阿里巴巴开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户打造一站式的分布式解决方案。 Seata官网给出的架构示例如下&#…

ruoyi-nbcio-plus基于vue3的flowable流程设计器主界面升级修改

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

C# 字节数组 byte[] 关于byte的小寄巧 以及Encoding和BitConverter

怎么读字节数组里面的内容 先是小错误 之 ToString然后是怎么办使用UTF-8编码使用ASCII编码使用其他编码未知编码注意 小demo下一个demo关于发送端的&#xff08;发送新行&#xff09;手搓bug编码之搓ascii encodeing评价为不如BitConverter一根 先是小错误 之 ToString 在C#中…

Docker客户端命令

一、在客户端输入 docker 命令,来查看 Docker 客户端的所有命令选项。 docker 使用 podman 模拟 Docker CLI 的功能,并创建 /etc/containers/nodocker 文件以静默消息。管理 pods、容器和镜像。 用法:podman [选项] [命令] 命令: attach 附加到一个正在运行的容器 auto-upd…

mysql故障排查

MySQL是目前企业最常见的数据库之一日常维护管理的过程中&#xff0c;会遇到很多故障汇总了常见的故障&#xff0c;MySQL默认配置无法满足高性能要求 一 MySQL逻辑架构图 客户端和连接服务核心服务功能存储擎层数据存储层 二 MySQL单实例常见故障 故障1 ERROR 2002 (HY000)…

深入理解npm常用命令

npm&#xff08;Node Package Manager&#xff09;是 Node.js 的包管理工具&#xff0c;用于管理 Node.js 应用程序的依赖包。除了安装、更新和卸载依赖包外&#xff0c;npm 还提供了许多其他功能&#xff0c;如初始化项目、运行脚本、查看依赖树等。本文将详细介绍一些常用的 …

RabbitMQ3.x之六_RabbitMQ使用场景

RabbitMQ3.x之六_RabbitMQ使用场景 文章目录 RabbitMQ3.x之六_RabbitMQ使用场景1. 为什么选择 RabbitMQ&#xff1f;1. 可互操作2. 灵活3. 可靠 2. 常见用户案例1. 服务解耦2. 远程过程调用3. 流处理4. 物联网 1. 为什么选择 RabbitMQ&#xff1f; RabbitMQ 是一个可靠且成熟的…

linux------jekins构建cicd

&#x1f388;个人主页&#xff1a;靓仔很忙i &#x1f4bb;B 站主页&#xff1a;&#x1f449;B站&#x1f448; &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;linux &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#…

vue3+threejs新手从零开发卡牌游戏(二十四):添加p2战斗逻辑

用代码模拟p2战斗逻辑&#xff0c;按流程进行步骤拆分&#xff1a; 1.p2抽卡 2.p2召唤怪兽上场 3.p2战斗 其中战斗部分分为几种情况&#xff1a; 情况一&#xff1a;p2场上卡牌由大到小进行排序&#xff0c;按序轮询可以攻击的卡牌&#xff0c;然后攻击p1场上卡牌由大到小…

第19次修改了可删除可持久保存的前端html备忘录:换了一个特别的倒计时时钟

第19次修改了可删除可持久保存的前端html备忘录:换了一个特别的倒计时时钟 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><met…

android framework 学习笔记(1)

学习资料&#xff1a;《Android Framework 开发揭秘》_哔哩哔哩_bilibili 什么是android framework 看图说话&#xff0c;android框架从上至下分为&#xff1a; 应用层(Application)&#xff0c;Java framework(Application Framework),Native framework. 包括Libraries 和 A…

数据透视:将三特征数据集转为矩阵

本文记录利用 wps的excel软件 将包含三个变量的数据集转换成矩阵的表达形式。 1.三特征数据集 三特征数据集/三元数据集&#xff1a;原始数据集的一般表达形式。每一行代表一个样本&#xff0c;每一列代表一个变量&#xff0c;共有3个变量。 2.数据透视表 设置3个变量的行、列和…

CSS3新增的语法(四)

CSS3新增的语法&#xff08;四&#xff09;【布局】 14. 多列布局15.伸缩盒模型1. 伸缩盒模型简介2. 伸缩容器、伸缩项目3. 主轴与侧轴4. 主轴方向5. 主轴换行方式6. flex-flow7. 主轴对齐方式8. 侧轴对齐方式8.1 一行的情况8.2 多行的情况 9.flex 实现水平垂直居中10. 伸缩性1…

Maven依赖冲突解决

Maven项目运行过程中&#xff0c;如果报以下错误&#xff0c; 极有可能是依赖冲突造成的。 Caused by:java.lang.NoSuchMethodError Caused by: java.lang.ClassNotFoundException 依赖冲突原理 依赖冲突指的就是我们在引入不同的依赖时&#xff0c;不同的依赖又引入了相同…

如何动态往Spring容器注册/移除bean?

几个关键点需要知道 本文不谈原理&#xff0c;直接上实战。 几个关键点&#xff1a;如何拿到Spring上下文来创建bean或移除bean&#xff1f;如何准备构建bean所需的BeanDefinition&#xff1f; 第一问&#xff1a;可注入bean工厂org.springframework.beans.factory.support.…

2024年150道高频Java面试题(二十)

39. 说一下 HashMap 的实现原理&#xff1f; HashMap 是 Java 中使用非常普遍的一种基于散列的映射数据结构&#xff0c;主要用于存储键值对。它允许使用任何非空对象作为键和值&#xff0c;主要实现原理如下&#xff1a; 数组 链表 红黑树&#xff1a;HashMap 内部主要由一…

【leetcode C++】滑动窗口

1. LCR 008. 长度最小的子数组 题目 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 题目…

CentOS7.x离线安装MySQL8

CentOS7.x离线安装MySQL8 1. 准备阶段 # 进入主目录 cd /env/# 创建用户与组 groupadd mysql useradd -r -g mysql -s /bin/false mysql# 下载安装文件 wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.12-linux-glibc2.12-x86_64.tar.xz# 解压并创建相关目录…