刚才面试的时候遇到的题。思路大概是用 maxTree()
算从 root 开始的最大值,用 maxNodes()
算任意两节点之间的最大值,每个 node 比较 maxNodes(left)
、maxNodes(right)
、maxTree(left) + maxTree(right) + value
三者之间的最大值,用递归。
但是感觉每个 node 都要算好几遍,而且还是递归,效率会很低,遇到大一点的要炸。有什么办法可以优化吗?
代码:
class TreeNode {
var value: Int
var left: TreeNode?
var right: TreeNode?
init(_ value: Int) {
self.value = value
}
}
func maxTree(_ root: TreeNode) -> Int { // max from root
if root.left == nil && root.right == nil {
return root.value
} else if root.left == nil {
return maxTree(root.right!) + root.value
} else if right == nil {
return maxTree(root.left!) + root.value
}
return max(maxTree(root.left!), maxTree(root.right!)) + root.value
}
func maxNodes(_ root: TreeNode) -> Int { // max between any 2 nodes
if root.left == nil && root.right == nil {
return root.value
} else if root.left == nil {
return max(maxNodes(root.right!), root.value + maxTree(root.right!))
} else if root.right == nil {
return max(maxNodes(root.left!), root.value + maxTree(root.left!))
}
return max(max(maxNodes(root.left!), maxNodes(root.right!)), maxTree(root.left!) + maxTree(root.right!) + root.value)
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.