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

news2024/12/26 11:49:18

题目

在这里插入图片描述
题目链接:
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.coloradmin.cn/o/1631179.html

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

相关文章

制作一个RISC-V的操作系统十四-任务同步和锁

文章目录 并发与同步临界区和锁锁死锁解决死锁自旋锁&#xff08;spin lock&#xff09;原子性问题原子操作实现amoswap.w.aq例子 另一种方法自旋锁的注意事项代码其他同步技术 并发与同步 控制流&#xff1a;可理解为任务或进程 中断也可以理解为一个切换到另一个任务&#…

Webpack-入门

定义 静态模块&#xff1a;指的是编写代码过程中的html&#xff0c;css&#xff0c;js&#xff0c;图片等固定内容的文件 打包&#xff1a;把静态模块内容压缩、整合、翻译等&#xff08;前端工程化&#xff09; 1&#xff09;把less/sass转成css代码 2&#xff09;把ES6降级…

C语言-用二分法在一个有序数组中查找某个数字

1.题目描述 有15个数按由大到小顺序放在一个数组中&#xff0c;输入一个数&#xff0c;要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中&#xff0c;则输出“无此数” 二.思路分析 记录数组中左边第一个元素的下标为left&#xff0c;记录数组右边第一个…

GaussianCube:使用最优传输构造高斯溅射用于3D生成建模

GaussianCube: Structuring Gaussian Splatting using Optimal Transport for 3D Generative Modeling GaussianCube&#xff1a;使用最优传输构造高斯溅射用于3D生成建模 Bowen Zhang1⁣*    Yiji Cheng2⁣*   Jiaolong Yang3   Chunyu Wang3 张博文 1⁣* 程一季 2⁣* …

10.shell数组

shell数组 数组基本概述什么是数组数组的分类普通数组关联数组 数组的遍历与循环案例1:案例2:案例3:案例4: 数组基本概述 什么是数组 数组其实也算是变量&#xff0c;传统的变量只能存一个值&#xff0c;但是数组可以存多个值。 实际使用中主要通过for循环遍历数组中的数据 …

【万字长文】看完这篇yolov4详解,那算是真会了

前言 目标检测作为计算机视觉领域的一个核心任务&#xff0c;其目的是识别出图像中所有感兴趣的目标&#xff0c;并给出它们的类别和位置。YOLO&#xff08;You Only Look Once&#xff09;系列模型因其检测速度快、性能优异而成为该领域的明星。随着YOLOv4的推出&#xff0c;…

16 秒杀场景如何保证命中的存储分片不挂

从“第 12 讲”到“第 14 讲”&#xff0c;我们介绍了可以应对百万并发扣减请求&#xff0c;以及同时能够保障高性能的架构方案。此外&#xff0c;上述的架构方案还具备水平扩展能力&#xff0c;即当流量增加后&#xff0c;可以通过扩容底层存储和应用服务器来应对。 但面对百…

7-29 删除字符串中的子串

题目链接&#xff1a;7-29 删除字符串中的子串 一. 题目 1. 题目 2. 输入输出样例 3. 限制 二、代码&#xff08;python&#xff09; 1. 代码实现 str1 input().split(\n)[0] str2 input().split(\n)[0] while str2 in str1:str1 str1.replace(str2, "") // 删…

Elasticsearch概念 使用docker安装Elasticsearch和kibana

目录 一、Elasticsearch概念 倒排索引和正向索引 正向和倒排 二、ES安装 三、安装 kibana 四、IK分词器 下载ES中文分词器 扩展或停用词条 一、Elasticsearch概念 倒排索引和正向索引 正向索引 就像在mysql数据中搜索非主键字段的内容&#xff0c;就需要逐条数据的去查…

IDM下载器_Internet Download Manager 6.42.7

网盘下载 IDM下载器是一款针对互联网所打造的下载管理器。IDM下载器能将下载速度提高5倍&#xff0c;恢复因丢失的连接&#xff0c;网络问题&#xff0c;计算机关闭或意外断电而重新启动中断或中断的下载。IDM下载器还可支持所有流行的浏览器&#xff0c;以使用独特的“高级浏…

记录一次 vue3 + ele pls 改写 饿了么主题色实践

一、改写 element 主题色 在 main.ts 中引入需要改写的 scss 文件 main.ts: import ./styles/element-plus.scss在自定义的 element-plus.scss 文件中改写 ele pls 的变量 element-plus.scss&#xff1a; /** * 更改主题色 */ :root {--el-color-primary: #285fbb; // 主…

【智能算法】土拨鼠优化算法(PDO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2022年&#xff0c;AE Ezugwu等人受到土拨鼠觅食行为与自然行为启发&#xff0c;提出了土拨鼠优化算法&#xff08;Prairie Dog Optimization algorithm, PDO&#xff09;。 2.算法原理 2.1算法思…

取地址及const取地址操作符重载

这两个默认成员函数一般不用重新定义 &#xff0c;编译器默认会生成。 class Date { public : //这两个运算符一般不需要重载&#xff0c;使用编译器生成的默认取地址的重载即可&#xff0c;只有特殊情况&#xff0c;才需 //要重载&#xff0c;比如想让别人获取到指定的内容…

第十五届蓝桥杯省赛第二场PythonB组A题【进制】题解(AC)

解题思路 按照题意进行模拟&#xff0c;计算 x x x 的 b b b 进制过程中&#xff0c;若出现余数大于 9 9 9&#xff0c;则说明 x x x 的 b b b 进制一定要用字母进行表示。 x 8100178706957568def check(x, b):while x:if x % b > 10:return Falsex // breturn True…

网络准入设备和软件有哪些 推荐八款网络准入设备

网络准入设备是确保网络安全的重要组成部分&#xff0c;它们负责控制和管理哪些设备能够接入网络以及如何接入。以下是一些常见的网络准入设备和软件。 1.认证服务器&#xff1a; 这是网络准入控制的核心组件&#xff0c;负责对用户或设备进行身份验证。常见的认证协议包括RAD…

【GitHub】主页简历优化

【github主页】优化简历 写在最前面一、新建秘密仓库二、插件卡片配置1、仓库状态统计2、Most used languages&#xff08;GitHub 常用语言统计&#xff09;使用细则 3、Visitor Badge&#xff08;GitHub 访客徽章&#xff09;4、社交统计5、打字特效6、省略展示小猫 &#x1f…

echarts实现水滴图

使用echarts实现水滴图 引入依赖&#xff0c;echarts-liquidfill3兼容echarts5; 安装依赖 "echarts": "^5.4.3","echarts-liquidfill": "^3.1.0",npm install echarts-liquidfill3.1.0 -S实现的效果图 构建一个水滴图的页面 <tem…

动态规划|714.买卖股票的最佳时机含手续费

力扣题目链接 class Solution { public:int maxProfit(vector<int>& prices, int fee) {int n prices.size();vector<vector<int>> dp(n, vector<int>(2, 0));dp[0][0] - prices[0]; // 持股票for (int i 1; i < n; i) {dp[i][0] max(dp[i …

交直流充电桩检测的基础知识

交直流充电桩检测是电动汽车充电设施的重要组成部分&#xff0c;其目的是确保充电桩的正常运行&#xff0c;保障电动汽车的安全充电。以下是关于交直流充电桩检测的一些基础知识。 我们需要了解什么是交直流充电桩&#xff0c;简单来说&#xff0c;交直流充电桩是一种为电动汽车…

本地部署 Meta Llama3-8b

Meta Llama 3(8B) Instruct model performance Meta Llama 3(8B) Pre-trained model performance 使用 Ollama 运行 Llama3 访问 Tags llama3&#xff0c;选择你想运行的模型&#xff0c;例如&#xff0c;8b-instruct-q8_0 拷贝并运行命令&#xff0c;ollama run llama3:8b-…