算法- 求解最大平均值的子树-经典dfs题目
给一棵二叉树,找到有最大平均值的子树。返回子树的根结点。
Example
样例1
输入:
{1,-5,11,1,2,4,-2}
输出:11
说明:
这棵树如下所示:
1
/ \
-5 11
/ \ / \
1 2 4 -2
11子树的平均值是4.333,为最大的。
样例2
输入:
{1,-5,11}
输出:11
说明:
1
/ \
-5 11
1,-5,11 三棵子树的平均值分别是 2.333,-5,11。因此11才是最大的.
参考代码:
"""
Definition of TreeNode:
class TreeNode:
def __init__(self, val):
self.val = val
self.left, self.right = None, None
""" class Solution:
"""
@param root: the root of binary tree
@return: the root of the maximum average of subtree
"""
def findSubtree2(self, root):
# write your code here
self._result_node = None
self._result_val = -float("inf")
self.find_sub_tree(root)
return self._result_node def find_sub_tree(self, root):
if not root:
return 0, 0 left_sum, left_size = self.find_sub_tree(root.left)
right_sum, right_size = self.find_sub_tree(root.right) sum = root.val + left_sum + right_sum
size = left_size + right_size + 1
avg_val = float(sum)/size if self._result_node is None or self._result_val < avg_val:
self._result_node = root
self._result_val = avg_val return sum, size
关于何时使用成员变量的问题,如果_result_node 不是成员变量,则需要以参数形式返回,在所有节点遍历时候用到,导致代码重复,因此直接使用成员变量(有点全局的味道)更好。
官方代码:【写得比我好,尤其是成员变量使用static】
class Solution:
# @param {TreeNode} root the root of binary tree
# @return {TreeNode} the root of the maximum average of subtree
average, node = 0, None def findSubtree2(self, root):
# Write your code here
self.helper(root)
return self.node def helper(self, root):
if root is None:
return 0, 0 left_sum, left_size = self.helper(root.left)
right_sum, right_size = self.helper(root.right) sum, size = left_sum + right_sum + root.val, \
left_size + right_size + 1 if self.node is None or sum * 1.0 / size > self.average:
self.node = root
self.average = sum * 1.0 / size return sum, size
需要在遍历中记住上次遍历节点,根据上次的节点和当前节点进行比较而得到result的算法模板:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
class Solution(): last_node = None result = None def run(self, root): self.dfs(root) return self.result def dfs(self): if last_node is None: last_node = root else: do_sth(last_node, root) dfs(root.left) dfs(root.right) |
算法- 求解最大平均值的子树-经典dfs题目的更多相关文章
- 有意义的单词分割——经典dfs题目
680. 分割字符串 中文 English 给一个字符串,你可以选择在一个字符或两个相邻字符之后拆分字符串,使字符串由仅一个字符或两个字符组成,输出所有可能的结果 样例 样例1 输入: "1 ...
- 算法实践——舞蹈链(Dancing Links)算法求解数独
在“跳跃的舞者,舞蹈链(Dancing Links)算法——求解精确覆盖问题”一文中介绍了舞蹈链(Dancing Links)算法求解精确覆盖问题. 本文介绍该算法的实际运用,利用舞蹈链(Dancin ...
- POJ 1321 - 棋盘问题 - [经典DFS]
题目链接:http://poj.org/problem?id=1321 Time Limit: 1000MS Memory Limit: 10000K Description 在一个给定形状的棋盘(形 ...
- 转载 - 算法实践——舞蹈链(Dancing Links)算法求解数独
出处:http://www.cnblogs.com/grenet/p/3163550.html 在“跳跃的舞者,舞蹈链(Dancing Links)算法——求解精确覆盖问题”一文中介绍了舞蹈链(Dan ...
- 深度实战玩转算法, Java语言7个经典应用诠释算法精髓
深度实战玩转算法,以Java语言主讲,通过7款经典好玩游戏,真正将算法用于实际开发,由算法大牛ACM亚洲区奖牌获得者liuyubobobo主讲,看得见的算法,带领你进入一个不一样的算法世界,本套课程共 ...
- 跳跃的舞者,舞蹈链(Dancing Links)算法——求解精确覆盖问题
精确覆盖问题的定义:给定一个由0-1组成的矩阵,是否能找到一个行的集合,使得集合中每一列都恰好包含一个1 例如:如下的矩阵 就包含了这样一个集合(第1.4.5行) 如何利用给定的矩阵求出相应的行的集合 ...
- 基于粒子群算法求解求解TSP问题(JAVA)
一.TSP问题 TSP问题(Travelling Salesman Problem)即旅行商问题,又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选 ...
- 隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数
隐马尔科夫模型HMM(一)HMM模型 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率 隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数(TODO) 隐马尔科夫模型HMM(四)维特比算法 ...
- EM 算法求解高斯混合模型python实现
注:本文是对<统计学习方法>EM算法的一个简单总结. 1. 什么是EM算法? 引用书上的话: 概率模型有时既含有观测变量,又含有隐变量或者潜在变量.如果概率模型的变量都是观测变量,可以直接 ...
随机推荐
- Oracle Spatial分区应用研究之七:同等分区粒度下全局索引优于分区索引的原因分析
1.实验结论 同等分区粒度下,使用分区空间索引进行空间查询,比使用全局空间索引进行查询,对数据字典表的访问次数更多.假设分区数为X,则大概多3X次访问.具体说明见6实验结论. 2.实验目的 在之前的测 ...
- lvm的一些特殊命令
pvscan --cache # 将lvm信息同步到其他节点 ......未完待续
- django使用https
根据以下内容总结了下: http://www.voidcn.com/article/p-xxdfvetx-da.html http://www.voidcn.com/article/p-ezmbnny ...
- 【转帖】Spark设计理念与基本架构
Spark设计理念与基本架构 https://www.cnblogs.com/swordfall/p/9280006.html 1.基本概念 Spark中的一些概念: RDD(resillient d ...
- GitLabCICD
CI/CD是什么 CI全名Continuous Integration,啥意思?就是我们经常听到的持续集成概念.当开发每天会提交多次代码到主干上,会做一些重复性的动作时,就可以用持续集成环境来操作.有 ...
- 微信小程序获取微信绑定的手机号
怎么获取微信绑定手机号呢?我们授权登录的时候,我们只能获取微信登录人员的头像,昵称,性别之类的,而手机号需要二次授权才可以,那么获取手机号都需要哪些条件呢?来看官方文档 获取手机号 获取微信用户绑定的 ...
- hive工作中的一些优化策略
1.hive抓取策略 hive.fetch.task.conversion = more/none more不走mr,none走mr 2.explain 显示执行计划 3.设置 ...
- yii2 AppAsset.php 和 assetManager 组件
01) 背景:Yii2中使用了 AdminLTE 3.0.0 后框架自带的bootstrap.css 与 admin样式有冲突,需要去掉 bootstrap.css 在 backend/config ...
- 异或序列 [set优化DP]
也许更好的阅读体验 \(\mathcal{Description}\) 有一个长度为 \(n\)的自然数序列 \(a\),要求将这个序列分成至少 \(m\) 个连续子段 每个子段的价值为该子段的所有数 ...
- 在O(1)的时间内删除链表节点
题目: 在O(1)的时间内删除链表节点.给定链表的头指针和待删除的节点指针,定义一个函数在O(1)的时间内删除该节点. 剑指offer的思路,顿时觉得极妙.删除节点node1,先把其下一个节点node ...