谷歌(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;通过布局线上线下多业态的融合发…

分布式事务之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…

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…

【leetcode C++】滑动窗口

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

“梦该醒了,少年”

顺序表 1、数据结构相关概念2、顺序表2.1、顺序表的概念及结构2.2、顺序表分类2.3、动态顺序表的实现 3、ps:源码 1、数据结构相关概念 数据结构是由“数据”和“结构”两词组合⽽来。 什么是数据&#xff1f; 常⻅的数值1、2、3、4…、教务系统⾥保存的⽤⼾信息&#xff08…

将 Elasticsearch 向量数据库引入到数据上的 Azure OpenAI 服务(预览)

作者&#xff1a;来自 Elastic Aditya Tripathi Microsoft 和 Elastic 很高兴地宣布&#xff0c;全球下载次数最多的向量数据库 Elasticsearch 是公共预览版中 Azure OpenAI Service On Your Data 官方支持的向量存储和检索增强搜索技术。 这项突破性的功能使你能够利用 GPT-4 …

docker-compose运行springinitializr用来创建springboot2

前言 spring initializr官方的地址是: https://start.spring.io/ &#xff0c;这是一个用来创建springboot脚手架的一个工具&#xff0c;但是目前这个工具已经更新到springboot3&#xff0c;而我还没学springboot3&#xff0c;目前还想继续创建springboot2&#xff0c;我就想能…

vue处理后端返回的日志

vue处理后端返回的日志&#xff0c;并保持日志内容最新&#xff08;滚动到最新内容&#xff09; 1、后端返回的日志格式如下所示&#xff0c;该如何处理成正常的文本换行 2、在获取日志的接口中做如下处理&#xff0c;把返回的/n替换成换行标签&#xff0c;并根据任务状态判断…

在Windows的Docker上部署Mysql服务

在我们做一些和数据库相关的测试时&#xff0c;往往需要快速部署一个数据库作为数据源。如果开发环境是Windows&#xff0c;且开发的代码不依赖于系统&#xff0c;即不用在linux上做开发&#xff0c;则可以将全套环境都部署在Windows上。 本地安装数据库会污染操作系统环境&…

算法设计与分析实验报告python实现(串匹配问题、采用分治法求解最大连续子序列和问题、用分治策略求众数问题、最近点对问题)

一、 实验目的 1&#xff0e;加深学生对算法设计方法的基本思想、基本步骤、基本方法的理解与掌握&#xff1b; 2&#xff0e;提高学生利用课堂所学知识解决实际问题的能力&#xff1b; 3&#xff0e;提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 1、串匹配问…

Vue2电商前台项目(一):项目前的初始化及搭建

一、项目初始化 创建项目&#xff1a;sudo vue create app 1.项目配置 &#xff08;1&#xff09;浏览器自动打开 在package.json文件中&#xff0c;serve后面加上 --open "scripts": {"serve": "vue-cli-service serve --open","buil…