[解题报告]Time Needed to Inform All Employees

本文探讨了在给定树形结构中寻找从根节点到叶子节点最长路径的算法实现。通过逆向思维,从每个叶子节点出发,累积到达根节点的权重,采用类似SPFA最短路算法思想,确保时间复杂度控制在O(N^2),并分享了一个高效的Go语言实现案例。
摘要由CSDN通过智能技术生成

题目链接
给定一个树形关系结构
只有一个根节点headID
求从headID到叶子节点的最长路径

反向去想,以每个叶子节点为起点,累加其到达headID节点的权重,若累加过程发现到达途径点x累积权重没有别的叶子节点经过该x点的权重,则停止累积(也可以成为停止松弛)
有一些最短路算法SPFA的思想
若有N个节点
时间复杂度
O(N ^ 2)
Runtime: 160 ms (beats 97.41%)
Memory Usage: 9.1 MB

func numOfMinutes(n int, headID int, manager []int, informTime []int) int {
	costs := make([]int, len(manager))
	exist := make([]bool, len(manager))

	for _, v := range manager {
		if v == -1 {
			exist[headID] = true
		} else {
			exist[v] = true
		}
	}

	var calcCosts func(src int)
	calcCosts = func(src int) {
		if src == headID {
			return
		}
		if informTime[manager[src]] + costs[src] > costs[manager[src]] {
			costs[manager[src]] = informTime[manager[src]] + costs[src]
			calcCosts(manager[src])
		}
	}

	for i, v := range exist {
		if !v {
			calcCosts(i)
		}
	}

	return costs[headID]
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值