牛客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,一经查实,立即删除!

相关文章

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;初衷是为了保证数据安全。 近些年&…

免费实用在线小工具

免费在线工具 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…

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…

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

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

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…

【C语言】编译与链接

1.翻译环境与运行环境 在ANSI C的任何一种实现中&#xff0c;存在两个不同的环境。 1.翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令&#xff08;二进制指令&#xff09; 2.执行环境&#xff0c;它用于实际执行代码 2.翻译环境 那么翻译环境是怎么将源代码…

Windows系统中下Oracle 19C数据库超级详细安装、设置教程(自己电脑上安装Oracle学习,保姆级教学,亲测有效)

Oracle 官方提供了一个基于 Java 技术的图形界面安装工具&#xff1a;Oracle Universal Installer&#xff08;Oracle 通用安装器&#xff09;简称 OUI&#xff0c;利用它可以完成在不同操作系统平台上&#xff08;Windows、Linux、UNIX&#xff09;的、不同类型的、不同版本的…

历时三年,花了200万,小米换的新标值这个价吗?

原创 航通社 航通社 收录于话题#小米1#小米新logo1#营销1 以及为什么要搞一套“设计哲学” 航通社首发原创文章&#xff0c;未经授权禁止转载 微博&#xff1a;航通社 | 微信搜一搜&#xff1a;2021年 第12期 文 / 书航 2021.3.31 小米集团宣布了 10 年来的首次标识&#x…

uni-app canvas 签名

调用方法 import Signature from "/components/signature.vue" const base64Img ref() //监听getSignImg uni.$on(getSignImg, ({ base64, path }) > {base64Img.value base64//console.log(签名base64, path >, base64, path) //拿到的图片数据// 之后取消…

Levenberg-Marquardt (LM) 算法进行非线性拟合

目录 1. LM算法2. 调包实现3. LM算法实现4. 源码地址 1. LM算法 LM算法是一种非线性最小二乘优化算法&#xff0c;用于求解非线性最小化问题。LM主要用于解决具有误差函数的非线性最小二乘问题&#xff0c;其中误差函数是参数的非线性函数&#xff0c;需要通过调整参数使误差函…

Vue Canvas图片水印的绘制 图片加水印

效果 定义画布 <canvas width"800" height"800" ref"cn" ></canvas>绘制水印 draw(){const img new Image()img.srchttps://img1.baidu.com/it/u3035183739,1826404114&fm253&fmtauto&app138&fJPEGimg.onload(()…

pyqt 动态更换表头和数据

目录 pyqt 动态更换表头和数据代码 效果图&#xff1a; pyqt 动态更换表头和数据代码 from PyQt5.QtGui import QColor, QBrush from PyQt5.QtWidgets import QApplication, QTableWidget, QVBoxLayout, QWidget, QPushButton, QTableWidgetItemclass Example(QWidget):def _…

Redis底层数据结构之ZSkipList

目录 一、概述二、ZSkipList结构三、和平衡树和哈希表的对比 redis底层数据结构已完结&#x1f44f;&#x1f44f;&#x1f44f;&#xff1a; ☑️redis底层数据结构之SDS☑️redis底层数据结构之ziplist☑️redis底层数据结构之quicklist☑️redis底层数据结构之Dict☑️redis…

机器学习和深度学习-- 李宏毅(笔记与个人理解)Day22

Day 22 Transformer seqence to seqence 有什么用呢&#xff1f; Encoder how Block work 仔细讲讲Residual 的过程&#xff1f; 重构 Decoder - AutoRegressive Mask 由于是文字接龙&#xff0c;所以无法考虑右边的 info 另一种decoder Encoder to Decoder – Cross Attend…