面試題目記錄之 求數據流中位數,求單項鍊表長度(考慮有環), 判斷是否爲平衡二叉樹

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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章