我正在解决leetcode的最大二叉树问题。TL;DR 是你有一个数组,例如这个:
[3,2,1,6,0,5]
您应该获取最大元素并将其作为树的根。然后将数组分为该元素左侧的部分和右侧的部分,这些部分分别用于以相同的方式递归创建左子树和右子树。
LeetCode 声称最佳解决方案(显示在“解决方案”选项卡中)在每个递归步骤中使用线性搜索来寻找子数组的最大值。在最坏的情况下,这是 O(n^2)。这是我想出的解决方案,而且很简单。
然而,我正在查看其他提交的内容并找到了线性时间解决方案,但我很难理解它是如何工作的!它看起来像这样:
def constructMaximumBinaryTree(nums):
nodes=[]
for num in nums:
node = TreeNode(num)
while nodes and num>nodes[-1].val:
node.left = nodes.pop()
if nodes:
nodes[-1].right = node
nodes.append(node)
return nodes[0]
nodes我已经分析了这个函数,总的来说,这似乎是线性时间 (O(n)),因为每个唯一节点最多添加到数组中并从数组中弹出一次。我尝试使用不同的示例输入来运行它,但我正在努力将这些点连接起来并理解它是如何工作的。有人可以向我解释一下吗?
qq_遁去的一_1
相关分类