牛客NC99 多叉树的直径【较难 深度优先 Java/Go/PHP】

题目

在这里插入图片描述
题目链接:
https://www.nowcoder.com/practice/a77b4f3d84bf4a7891519ffee9376df3

思路

核心就是树的最大直径(globalMax)一定是以某一个node为root最长的两个path-to-leaf.
就是普通dfs的同时算路径长度。时间: O(n), DFS一次
空间: O(n)

参考答案Java

import java.util.*;/** public class Interval {*   int start;*   int end;*   public Interval(int start, int end) {*     this.start = start;*     this.end = end;*   }* }*/public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** 树的直径* @param n int整型 树的节点个数* @param Tree_edge Interval类一维数组 树的边* @param Edge_value int整型一维数组 边的权值* @return int整型*/public int solve (int n, Interval[] Tree_edge, int[] Edge_value) {//核心就是树的最大直径(globalMax)一定是以某一个node为root最长的两个path-to-leaf.//就是普通dfs的同时算路径长度。////时间: O(n), DFS一次//空间: O(n)// node_id -> { {nei1, cost1}, {nei2, cost2}, ... }Map<Integer, List<int[]>> graph = new HashMap<>();int[] globalMax = {0};// construct graphfor (int i = 0; i < n ; i++) {graph.put(i, new ArrayList<int[]>());}for (int i = 0; i < n - 1 ; i++) {// treat tree edge as bi-directionalint from = Tree_edge[i].start;int to = Tree_edge[i].end;graph.get(from).add(new int[] {to, Edge_value[i]});graph.get(to).add(new int[] {from, Edge_value[i]});}// 因为edge是bi-directional, 随便从哪个node开始dfs都一样。这里用了node-0.// -1 作为parentdfs(graph, globalMax, 0, -1);return globalMax[0];}// returns the max cost path-to-leaf from this root.public int dfs(Map<Integer, List<int[]>> graph, int[] ans, int root,int parent) {int maxCost = 0;int maxCost2 = 0;for (int[] nexts : graph.get(root)) {// NOTE: BaseCase (i.e. leaf) has only 1 nei, which is the parent//       thus leaf will return maxCost = 0 directly.if (nexts[0] == parent) continue;// recursively finds the max cost path to any leafint cost = dfs(graph, ans, nexts[0], root) + nexts[1];// keep 2 largest costif (cost >= maxCost) {maxCost2 = maxCost;maxCost = cost;} else if(cost >=maxCost2){maxCost2 = cost;}}// check if the 2 largest path is the global maxint curcost = maxCost + maxCost2;if (curcost > ans[0]) {ans[0] = curcost;}return maxCost;}
}

参考答案Go

package mainimport . "nc_tools"/** type Interval struct {*   Start int*   End int* }*//*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** 树的直径* @param n int整型 树的节点个数* @param Tree_edge Interval类一维数组 树的边* @param Edge_value int整型一维数组 边的权值* @return int整型*/
func solve(n int, Tree_edge []*Interval, Edge_value []int) int {//核心就是树的最大直径(globalMax)一定是以某一个node为root最长的两个path-to-leaf.//就是普通dfs的同时算路径长度。////时间: O(n), DFS一次//空间: O(n)// node_id -> { {nei1, cost1}, {nei2, cost2}, ... }graph := map[int][]*Node{} //map表示图// construct graphfor i := 0; i < n; i++ {graph[i] = []*Node{}}for i := 0; i < n-1; i++ {// treat tree edge as bi-directionalfrom := Tree_edge[i].Startto := Tree_edge[i].Endgraph[from] = append(graph[from], &Node{to, Edge_value[i]})graph[to] = append(graph[to], &Node{from, Edge_value[i]})}// 因为edge是bi-directional, 随便从哪个node开始dfs都一样。这里用了node-0.// -1 作为parentans := []int{0}dfs(graph, &ans, 0, -1)return ans[0]
}func dfs(graph map[int][]*Node, ans *[]int, root, parent int) int {maxCost := 0maxCost2 := 0for _, nexts := range graph[root] {// NOTE: BaseCase (i.e. leaf) has only 1 nei, which is the parent//       thus leaf will return maxCost = 0 directly.if nexts.to == parent {continue}// recursively finds the max cost path to any leafcost := dfs(graph, ans, nexts.to, root) + nexts.cost// keep 2 largest costif cost >= maxCost {maxCost2 = maxCostmaxCost = cost} else if cost >= maxCost2 {maxCost2 = cost}}// check if the 2 largest path is the global maxcursot := maxCost + maxCost2if cursot > (*ans)[0] {(*ans)[0] = cursot}return maxCost
}type Node struct {to   intcost int
}

参考答案PHP

<?php/*class Interval{var $start = 0;var $end = 0;function __construct($a, $b){$this->start = $a;$this->end = $b;}
}*//*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** 树的直径* @param n int整型 树的节点个数* @param Tree_edge Interval类一维数组 树的边* @param Edge_value int整型一维数组 边的权值* @return int整型*/
function solve( $n ,  $Tree_edge ,  $Edge_value )
{//核心就是树的最大直径(globalMax)一定是以某一个node为root最长的两个path-to-leaf.//就是普通dfs的同时算路径长度。////时间: O(n), DFS一次//空间: O(n)// node_id -> { {nei1, cost1}, {nei2, cost2}, ... }$graph = [];for($i=0;$i<$n;$i++){$graph[$i] = [];}// construct graphfor($i=0;$i<$n-1;$i++){$from = $Tree_edge[$i]->start;$to = $Tree_edge[$i]->end;$graph[$from][count($graph[$from])] = [$to,$Edge_value[$i]];$graph[$to][count($graph[$to])] = [$from,$Edge_value[$i]];}$ans = [0];// 因为edge是bi-directional, 随便从哪个node开始dfs都一样。这里用了node-0.// -1 作为parentdfs($graph,$ans,0,-1);return $ans[0];
}// returns the max cost path-to-leaf from this root.
function dfs($graph,&$ans,$root,$parent){$max1 =0;$max2 = 0;foreach ($graph[$root] as $nexts) {// NOTE: BaseCase (i.e. leaf) has only 1 nei, which is the parent//       thus leaf will return maxCost = 0 directly.if($nexts[0] == $parent) continue; //不走回头路// recursively finds the max cost path to any leaf$cost = dfs($graph,$ans,$nexts[0],$root)+$nexts[1];// keep 2 largest costif($cost >= $max1){$max2=$max1;$max1 = $cost;}else if($cost >=$max2){$max2 = $cost;}}// check if the 2 largest path is the global max$curcost = $max1+$max2;if($curcost > $ans[0]){$ans[0] = $curcost;}return $max1;
}

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

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

相关文章

通过this.$router.push跳转同一路由页面只会刷新一次的问题怎么解决

一、原因 Vue Router默认会认为同一路由之间的跳转是相同路由的导航&#xff0c;所以不会触发组件的重新渲染。 当我们连续重复跳转相同的路由导航时就会报错如&#xff1a; Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location…

在ArcGIS中,矢量数据有.shp,.mdb和.gdb,为啥建议使用gdb?

在ArcGIS中,矢量数据可以存储在多种格式中,如 .shp (Shapefile)、.mdb (Microsoft Access Database) 和 .gdb (Geodatabase)。每种格式都有其特定的用途和优缺点,但通常推荐使用 Geodatabase(.gdb)格式,原因如下: 1. 更高的数据容量和性能 容量: Shapefiles 和 MDB 文…

有关钱包相关开发的库和依赖

Trezor 钱包 GitHub 组织&#xff1a;https://github.com/trezor说明&#xff1a;Trezor 是一款硬件加密货币钱包&#xff0c;它的团队开发了与助记词相关的许多工具和库。 Electrum 钱包 GitHub 仓库&#xff1a;https://github.com/spesmilo/electrum说明&#xff1a;Electru…

Pytorch中保存模型的两种方法

目录 一、保存整个模型二、只保存模型参数 一、保存整个模型 这种方法会保存模型的整个定义&#xff08;包括网络结构和参数&#xff09;。这样保存的模型可以直接被加载并使用&#xff0c;但前提是保存和加载模型的代码环境需要完全一致。 保存模型时使用代码&#xff1a; …

stm32的GPIO基本结构

1.带FT标号的引脚能容忍5V 2.GPIO系统架构 stm32的所有GPIO都是挂载在APB2总线上的 3.GPIO的基本结构 在上图中&#xff0c;左边就是寄存器&#xff0c;右边就是驱动器了 保护二极管的作用&#xff1a;VDD表示3.3V&#xff0c;如果输入的电压的值大于3.3V&#xff0c;那么这个…

企业级OV SSL证书,主要应用在哪些场景

我们来看看OV SSL证书的一个典型应用&#xff0c;即电子商务网站。随着电子商务的发展&#xff0c;网上购物已经成为人们日常生活的一部分。然而&#xff0c;这同时也带来了一个问题&#xff0c;就是用户在进行网上交易时&#xff0c;如何保证其个人信息、银行卡信息等敏感数据…

就业班 第三阶段(nginx) 2401--4.26 day5 nginx5 nginx https部署实战

三、HTTPS 基本原理 1、https 介绍 HTTPS&#xff08;全称&#xff1a;HyperText Transfer Protocol over Secure Socket Layer&#xff09;&#xff0c;其实 HTTPS 并不是一个新鲜协议&#xff0c;Google 很早就开始启用了&#xff0c;初衷是为了保证数据安全。 近些年&…

BMP JPG PNG 介绍以及三者区别

BMP&#xff08;Bitmap&#xff09;、JPG&#xff08;Joint Photographic Experts Group&#xff09;和PNG&#xff08;Portable Network Graphics&#xff09;是三种常用的图像文件格式&#xff0c;各自具有独特的特性和应用场景。 下面是它们的详细介绍和区别&#xff1a; B…

免费实用在线小工具

免费在线工具 https://orcc.online/ pdf在线免费转word文档 https://orcc.online/pdf 时间戳转换 https://orcc.online/timestamp Base64 编码解码 https://orcc.online/base64 URL 编码解码 https://orcc.online/url Hash(MD5/SHA1/SHA256…) 计算 https://orcc.online/ha…

基于地图的平滑算法--佛洛依德路径平滑算法(FLOYD)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言基于地图的平滑算法--佛洛依德路径平滑算法(FLOYD)前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对*…

Python 数据库基类封装

目录 1.BaseEntity 2.t_user 3.DAOBase 4.UserDAO 刚开始用Python做Api后端&#xff0c;记录下学习过程 从数据库操作开始&#xff0c;定义实体&#xff0c;定义DAO层基类&#xff0c;及DAO业务类的使用 写的不好&#xff0c;有好的设计建议欢迎大家提出&#xff0c;一起…

Python 使用相对路径读取文件失败

python open一个问及那时使用绝对路径可以&#xff0c;但是使用相对路径时报错&#xff0c;找不到指定文件 解决步骤如下&#xff1a; 添加Python配置 在新增的配置Json文件添加下图红框这一行

知网怎么查重 知网查重的详细步骤

知网查重八个步骤&#xff1a;1. 访问官网&#xff0c;注册账号。2. 上传待查文档。3. 选择查重规则。4. 选择相似来源库。5. 提交查重任务。6. 等待查重结果。7. 获取查重报告。8. 下载查重报告。 知网查重的详细步骤 第一步&#xff1a;进入知网查重系统 打开浏览器&#x…

27.统一网关Gateway-路由断言工厂

在配置文件中写的断言规则只是字符串&#xff0c;这些字符串会被Predicate Factory读取并处理&#xff0c;转变为路由判断的条件。 例如&#xff1a;Path /user/** 是按照路劲匹配&#xff0c;这个规则是由 org.springframework.cloud.gateway.handler.predicate.PathRouteP…

一篇文章让你搞懂联邦学习算法

联邦学习(Federated Learning)是一种分布式机器学习技术,它可以在不共享数据的情况下训练模型。这种技术在多个参与方之间协作构建共享的预测模型,同时保持每个参与方的数据本地化,不暴露给其他方。联邦学习特别适用于数据隐私敏感的场景,如医疗、金融和移动设备等。 定…

目标检测——3D玩具数据集

在数字化时代&#xff0c;计算机视觉技术取得了长足的进展&#xff0c;其中基于形状的3D物体识别技术更是引起了广泛关注。该技术不仅有助于提升计算机对现实世界物体的感知能力&#xff0c;还在多个领域展现出了广阔的应用前景。本文将探讨基于形状的3D物体识别实验的重要性意…

Python爬取网易云平台

爬取网易云音乐平台的数据可能涉及到版权、隐私和平台的使用条款等问题&#xff0c;所以在你开始爬取之前&#xff0c;请确保你了解并遵守网易云音乐的使用条款和相关的法律法规。 如果你是为了个人学习或研究目的&#xff0c;并且尊重版权和隐私&#xff0c;你可以使用Python…

ACE框架学习3

ACE Acceptor-Connector框架 该框架实现 Acceptor-Connector 模式&#xff0c;该模式解除了“网络化应用中的协作对端服务的连接和初始化”与“连接和初始化之后它们所执行的处理”的耦合。Acceptor-Connector 框架允许成用独立于它们所提供的服务来配置其连接布局的关键属性。…

从阿里云迁移Redis到AWS的规划和前期准备

在将Redis实例从阿里云迁移到AWS之前,需要进行全面的规划和前期准备。以下九河云提供一些重要的步骤和注意事项: 1. 评估Redis使用情况 首先,您需要评估当前Redis实例的使用情况,包括实例规格、内存使用量、吞吐量、访问模式等。这将有助于选择合适的AWS Redis产品和实例类型…

一键设置jdk环境脚本

自动化脚本 一、使用方法 创建一个txt文本&#xff0c;放在和jdk存放的同一目录下&#xff0c;复制粘贴进我的代码&#xff0c;利用全局替换&#xff0c;将jdk1.8,改成你自己的jdk包名字&#xff0c;再重新把这个文件保存为.vbs文件。然后运行就行了 MsgBox "Runing s…