难度: Medium
Submission
运行时间: 2055 ms
内存: 39.4 MB
from sortedcontainers import SortedList class Solution: def maxDepthBST(self, order: List[int]) -> int: book = defaultdict(int) sl = SortedList([0]) ans = 0 for x in order: k = sl[sl.bisect_left(x) - 1] book[x + 1] = book[k + 1] = book[k + 1] + 1 sl.add(x) if ans < book[k + 1]: ans = book[k + 1] return ans
Explain
该题解使用了一个平衡二叉树(通过SortedList实现)和一个哈希表(defaultdict)来跟踪插入的每个元素的深度。对于输入的每一个元素x,我们首先查找它应该插入的位置。在SortedList中,我们找到紧邻x左侧的元素k,并将x的深度设置为k的深度加1。每次插入后,我们将x添加到SortedList中以保持元素的有序性,并更新最大深度。通过这种方式,我们可以有效地计算出二叉搜索树的最大深度。
时间复杂度: O(n log n)
空间复杂度: O(n)
from sortedcontainers import SortedList from collections import defaultdict class Solution: def maxDepthBST(self, order: List[int]) -> int: book = defaultdict(int) # 用于存储每个节点的深度 sl = SortedList([0]) # 初始化SortedList,用于维护元素的排序顺序 ans = 0 # 用于记录最大深度 for x in order: # 遍历插入序列 k = sl[sl.bisect_left(x) - 1] # 找到x左侧的元素 book[x + 1] = book[k + 1] = book[k + 1] + 1 # 更新x的深度为k的深度加1 sl.add(x) # 将x加入到SortedList中,保持排序 if ans < book[k + 1]: ans = book[k + 1] # 更新最大深度 return ans # 返回最大深度
Explore
SortedList是一种自动维护元素排序的数据结构,使用简单且在某些编程语言和库中直接可用,如Python的sortedcontainers库。它通过一种平衡树结构(通常是红黑树或AVL树)实现,提供了高效的插入、删除和查找操作。选择SortedList而非直接使用AVL或红黑树,主要是因为SortedList提供了更简洁的API和较少的实现复杂度,同时保持了较好的性能,尤其是在需要频繁进行有序操作的场景下。
在提到的代码实现中,使用`sl[sl.bisect_left(x) - 1]`来找到x左侧的元素k。如果x小于SortedList中的所有元素,`sl.bisect_left(x)`将返回0,此时`sl[sl.bisect_left(x) - 1]`会变为`sl[-1]`,即列表中的最后一个元素,这在逻辑上是不正确的。正确的处理方式应当是检查`sl.bisect_left(x)`的值是否为0,如果为0,则表示没有左侧元素,x的深度应该是1,因为它将作为树的根节点或其子树的根节点。
确实,`book[x + 1] = book[k + 1] = book[k + 1] + 1`这行代码存在逻辑和可能的语法错误。正确的方式应该是首先计算新的深度值,然后更新x对应的深度。例如,先通过`new_depth = book[k] + 1`计算出新的深度,然后使用`book[x] = new_depth`来更新x的深度。这样可以避免混淆和错误的数据更新。