牛客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 graph
        for (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-directional
            int 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 作为parent
        dfs(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 leaf
            int cost = dfs(graph, ans, nexts[0], root) + nexts[1];
            // keep 2 largest cost
            if (cost >= maxCost) {
                maxCost2 = maxCost;
                maxCost = cost;
            } else if(cost >=maxCost2){
                maxCost2 = cost;
            }
        }

        // check if the 2 largest path is the global max
        int curcost = maxCost + maxCost2;
        if (curcost > ans[0]) {
            ans[0] = curcost;
        }

        return maxCost;
    }
}

参考答案Go

package main

import . "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 graph
	for i := 0; i < n; i++ {
		graph[i] = []*Node{}
	}
	for i := 0; i < n-1; i++ {
		// treat tree edge as bi-directional
		from := Tree_edge[i].Start
		to := Tree_edge[i].End

		graph[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 作为parent
	ans := []int{0}
	dfs(graph, &ans, 0, -1)
	return ans[0]
}

func dfs(graph map[int][]*Node, ans *[]int, root, parent int) int {
	maxCost := 0
	maxCost2 := 0
	for _, 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 leaf
		cost := dfs(graph, ans, nexts.to, root) + nexts.cost
		// keep 2 largest cost
		if cost >= maxCost {
			maxCost2 = maxCost
			maxCost = cost
		} else if cost >= maxCost2 {
			maxCost2 = cost
		}

	}
	// check if the 2 largest path is the global max
	cursot := maxCost + maxCost2
	if cursot > (*ans)[0] {
		(*ans)[0] = cursot
	}

	return maxCost
}

type Node struct {
	to   int
	cost 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 graph
    for($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 作为parent
    dfs($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 cost
        if($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.mfbz.cn/a/580802.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(二十一)C++自制植物大战僵尸游戏僵尸游戏关卡结束数据处理

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/8UFMs 文件位置 代码实现的文件在Class\Scenes\GameScene文件夹中,如下图所示。 GameEndLayer.h class GSGameEndLayer :public LayerColor { public:CREATE_FUNC(GSGameEndLayer);void successfullEntry();void brea…

大田场景下的路径检测论文汇总

文章目录 2020Visual Servoing-based Navigation for Monitoring Row-Crop Fields 2020 Visual Servoing-based Navigation for Monitoring Row-Crop Fields code: https://github.com/PRBonn/visual-crop-row-navigation 摘要&#xff1a; 自主导航是野外机器人执行精确农业…

C++ day5

#include <iostream> using namespace std; class Person {string name;int *age; public:Person():name("zhangsan"),age(new int(18)){cout << "Person的无参构造" << endl;}Person(string name,int age):name("zhangsan"),…

喜报!得帆被评为2024年上海市重点服务独角兽企业

月23日&#xff0c;在市经济信息化委和闵行区政府指导下“2024年上海市重点服务独角兽&#xff08;潜力&#xff09;企业榜单发布会暨高质量发展产业对接会”在上海成功举办。 会上正式公布《2024年上海市重点服务独角兽&#xff08;潜力&#xff09;企业榜单》&#xff0c;上…

08_Scala函数式编程重点

文章目录 函数式编程1.创建简单函数2.可变参数3.默认参数4.函数式编程&#xff0c;代码简化 函数式编程 函数式编程是对功能进行封装&#xff0c;最终是需要等号 def test() {} //于python略有不同1.创建简单函数 // 1.定义函数def test(): Unit {}牛逼之处就是可以在m…

由于找不到msvcr120.dll,无法继续执行代码

在日常编程中&#xff0c;缺少关键的msvcr120.dll文件可能会导致代码无法执行&#xff0c;给我们带来不便。针对缺少msvcr120.dll文件的情况&#xff0c;我们可以采取一些有效的解决方法来解决这一问题。通过下载安装或使用Visual C Redistributable工具安装该msvcr120.dll文件…

数据结构四:线性表之带头结点的单向循环链表的设计

前面两篇介绍了线性表的顺序和链式存储结构&#xff0c;其中链式存储结构为单向链表&#xff08;即一个方向的有限长度、不循环的链表&#xff09;&#xff0c;对于单链表&#xff0c;由于每个节点只存储了向后的结点的地址&#xff0c;到了尾巴结点就停止了向后链的操作。也就…

STM32G431RBT6之LCD与LED配置

首先,配置时钟树,时钟树的配置在我的另外一篇博客里,这里不再赘述. LCD与LED具有共同的IO口,同时创建工程较好. 打开原理图,发现LED的IO口是PC8~PC15,还有一个容易看漏的PD2.LCD的IO口是PC0到PC15. 当然,看产品手册也可以知道,但是还是推荐大家看原理图. 打开cubumx,给PC0~PC…

如何讲好ppt演讲技巧(4篇)

如何讲好ppt演讲技巧&#xff08;4篇&#xff09; 如何讲好PPT演讲技巧&#xff08;四篇&#xff09; **篇&#xff1a;精心准备&#xff0c;奠定演讲基础 一个成功的PPT演讲&#xff0c;离不开精心的准备。首先&#xff0c;要确定演讲的主题和目标&#xff0c;确保演讲内容清…

应用实战|只需几步,即可享有外卖订餐小程序

本示例是一个简单的外卖查看店铺点菜的外卖微信小程序&#xff0c;小程序后端服务使用了MemFire Cloud&#xff0c;其中使用到的MemFire Cloud功能包括&#xff1a; 其中使用到的MemFire Cloud功能包括&#xff1a; 云数据库&#xff1a;存储外卖微信小程序所有数据表的信息。…

服务端不 listen 可以创建 tcp 连接吗

这个问题有三类答案。 上来就撸 linux kernel 源码&#xff0c;折腾半天&#xff0c;哦&#xff0c;终于在 tcp_rcv_state_process 里找到了 tcp_rcv_synsent_state_process 调用&#xff0c;后者包含&#xff1a; if (th->syn) {/* We see SYN without ACK. It is attemp…

前端JS必用工具【js-tool-big-box】,Number数值转换的方法调用学习

这一小节&#xff0c;我们针对前端工具包&#xff08;npm&#xff09;js-tool-big-box的使用做一些讲解&#xff0c;主要是针对Number数值型转换的一些方法使用。 目录 前言 1 安装和引入 2 千位逗号分割 3 判断是否大于0 4 判断是否大于0的整数 5 生成指定范围内的随机数…

leetcode 循环列表的插入(Python)

题目如果不进行思考&#xff0c;巨多坑。 首先我们需要找到列表中的最小值&#xff0c;最大值这个节点&#xff0c;因为找到后可以与我们的新元素进行比较厚插入。 找到最小值&#xff0c;最大值需要循环一遍列表&#xff0c;如果当前cur元素的值<nex元素的值&#xff0c;…

堆的应用——堆排序

堆排序 堆排序是一种基于比较的排序算法&#xff0c;它利用堆这种数据结构所设计。堆是一个近似完全二叉树的结构&#xff0c;并同时满足堆积的性质&#xff1a;即子结点的键值或索引总是小于&#xff08;或者大于&#xff09;它的父结点。 堆排序可以分为两个主要步骤&#…

smart200 做client,modbus_tcp读取modbus_slave

这里还隐藏一个重要的设置&#xff0c;就是站地址。这个在库函数里。不同plc位置会不一样&#xff0c;我这里是vb1651对应modbus的地址为255&#xff0c;这个值我们可以自己更改&#xff0c;范围为1-247. 打开modbus_slave 软件&#xff0c;

【C#】rdlc报表答应报错:未能加载文件或程序集“Microsoft.SqlServer.Types

文章目录 一、报错信息二、解决方式 一、报错信息 Microsoft.Reporting.WinForms.LocalProcessingException: An error occurred during local report processing. —> Microsoft.Reporting.DefinitionInvalidException: The definition of the report ‘’ is invalid. —&…

sql注入漏洞及其sqlmap工具的使用

一、sql注入的原理 sql注入概念&#xff1a; sql注入主要是将sql语句&#xff0c;插入到web表单提交或者输入域名或者页面请求的查询字符串&#xff0c;最 终 达到一个欺骗服务器执行sql语句的效果。 sql注入的原理&#xff1a;主要分为平台层注入和代码层注入两种原因 …

stm32的GPIO基本结构

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

百度网盘某个文件对外开放怎么弄通过密码下载文件对外开放某个文件

百度网盘某个文件对外开放怎么弄通过密码下载文件对外开放某个文件 百度云盘分享文件(创建公开连接)的方法&#xff1a; 1、登录网页&#xff0c;打开百度云盘&#xff0c;并登陆自己的帐号。 2、上传后选择自己需要分享的文件。 选择分享的文件 3、将鼠标放在需要分享的文…

上市企业数字赋能指数数据集-2001到2022年(TF-IDF)

01、数据简介 上市公司数字赋能指数是一个用来衡量上市公司利用数字技术提高业务能力和效率的指标。这个指数反映了上市公司利用大数据、云计算和人工智能等数字技术&#xff0c;高效地利用商业资源和信息&#xff0c;并扩展供应关系的能力。市公司数字赋能指数是一种综合性的…