一枚菜鳥的leetcode刷題筆記 Day15

2021-10-17 20:52:33 字數 2435 閱讀 2468

本題的解法完全參考了 利用二叉搜尋樹的性質,一次遞迴

二叉搜尋樹具有如下性質:

若任意結點的左子樹不空,則左子樹上所有結點的值均不大於它的根結點的值。

若任意結點的右子樹不空,則右子樹上所有結點的值均不小於它的根結點的值。

任意結點的左、右子樹也分別為二叉搜尋樹。

因此,我們可以得到求解的思路,假如 p 和 q 都小於根節點的值,那麼遍歷左子樹,假如 p 和 q 都大於根節點的值,就遍歷右子樹,其餘的任何情況下,直接返回根節點,就是我們要的答案。

class

solution

:def

lowestcommonancestor

(self, root:

'treenode'

, p:

'treenode'

, q:

'treenode')-

>

'treenode':if

not root:

return

none

while root:

if p.val > root.val and q.val > root.val:

root = root.right

elif p.val < root.val and q.val < root.val:

root = root.left

else

:return root

class

solution

:def

lowestcommonancestor

(self, root:

'treenode'

, p:

'treenode'

, q:

'treenode')-

>

'treenode':if

not root:

return

none

if p.val > root.val and q.val > root.val:

return self.lowestcommonancestor(root.right, p, q)

elif p.val < root.val and q.val < root.val:

return self.lowestcommonancestor(root.left, p, q)

return root

給定乙個整數,編寫乙個函式來判斷它是否是 2 的冪次方。

class

solution

:def

ispoweroftwo

(self, n:

int)

->

bool

:for i in

range(32

):mask =

1<< i #返回的是2^i

if n ^ mask ==0:

return

true

return

false

這道題目一看是求2的冪我就想到位異或。選擇乙個較大的數num

ma

xnum_

nummax

​作為範圍,即我們的方法適用的資料範圍<2n

umma

x< 2^}

<2n

umma

x​. 相當於不斷拿n去和2的直到num

ma

xnum_

nummax

​冪為模板去比較。

注意:<<是python的運算子,通過從右側推入零來向左移動,推掉最左邊的位(zero fill left shift)。

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-tswkxprz-1611755829000)(media/16104455646898/%e5%b1%8f%e5%b9%95%e5%bf%ab%e7%85%a7%202021-01-26%20%e4%b8%8b%e5%8d%8822.57.14%20%e4%b8%8b%e5%8d%88.png)]

class

solution

:def

ispoweroftwo

(self, n:

int)

->

bool

:if n ==0:

return

false

return n &

(n-1)==

0

位運算:求解2的冪

這個解法很簡單,找到規律後非常容易實現。

對於n為2的冪的數,都有 n & (n-1)=0,所以這就是我們的判斷條件。

把 0 單獨拿出來討論是因為0 & (0-1) = 0,但 0 不是 2的冪。

一枚菜鳥的leetcode刷題筆記 Day5

給你乙個鍊錶陣列,每個鍊錶都已經按公升序排列。請你將所有鍊錶合併到乙個公升序鍊錶中,返回合併後的鍊錶。class solution def merge2lists self,l1,l2 l1 and l2 are two linked lists head listnode rehead head ...

一枚菜鳥的leetcode刷題筆記 Day8

70 爬樓梯 78 子集 乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 問總共有多少條不同的路徑?class solution def uniquepaths self,m...

一枚菜鳥的leetcode刷題筆記 Day11

給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。說明 你的演算法應該具有線性時間複雜度。你可以不使用額外空間來實現嗎?class solution def singlenumber self,nums list int int tmp for n...