面试题目记录之 求数据流中位数,求单项链表长度(考虑有环), 判断是否为平衡二叉树

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)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值