1. 求数据流中位数
对于固定长度数组,求中位数可以考虑 快排的思想, 以及最大堆,最小堆。
对于数据流,最大堆最小堆比较直观。需要注意的是要保证最大堆和最小堆的size一致(差不能大于1).
2. 单项链表长度
https://www.cnblogs.com/xudong-bupt/p/3667729.html
1. 无环,直接判断 phead == None.
2. 有环。设两个指针,一个快(步长为2),一个慢(步长为1)。 两个指针会在环中相遇,此为第一次相遇。
假设此时,慢指针走过的链表个数为 x. 且易知, 慢指针此时必定还没有完成链表的一次遍历。假设,此时,慢指针的位置,距离环首的距离为y
但此时,并无法判断出是在环中的什么位置相遇,也无法知道链表长度。
接着,快指针固定不动,慢指针往前走,第二次相遇时,走过的步长,即为环的长度,设为 c。
则有等式: l1 + y = x
l1 + n*c + y = 2*x
所以 (n+1)*c = x
所以 l1 = x-y = (n+1)*c -y = n*c + c-y c-y 是慢指针第一次相遇点到环终点的距离。 那么也就意味着,
此时,从链表头增加一个新的慢指针,以步长为1 循环,一定可以与原来的满指针在环入口相遇。
至此,也可以求出l1 的长度。
链表的总长度即为 l1 + c
3. 判断是否为平衡二叉树
https://www.cnblogs.com/icekx/p/9131304.html
# 判断二叉树是否为平衡二叉树
# 先判断该节点是否平衡
# 再递归去判断左节点和右节点是否平衡
# 递归求当前节点的深度
def getdepth(node):
if not node:
return 0
ld = getdepth(node.left)
rd = getdepth(node.right)
return max(ld, rd) + 1
def isB(head):
if not head:
return True
ld = getdepth(head.left)
rd = getdepth(head.right)
if abs(ld - rd) > 1:
return False
return isB(head.left) and isB(head.right)