相同的二元樹 | Easy | LeetCode#100. Same Tree
題目敘述 題目難度: Easy 題目敘述: 給定兩個 Binary Tree 的 root,分別是 p 與 q,請寫一個函式檢查他們是否相同 相同的定義: 結構一樣,並且節點值一樣 解法一開始的想法我的想法一樣是遞迴,首先Traverse 到 Leaf,之後檢查節點值,如果不一樣就直接回傳 false,我們可以用一個變數值,將遞迴回傳的結果保存起來,再做為函式的返回值 我的解法12345678910111213141516171819202122232425262728/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullpt...
反轉二元樹 | Easy | LeetCode#226. Invert Binary Tree
題目敘述 題目難度: Easy 題目敘述: 給定一個 Binary Tree 的root,反轉他以後,回傳它的 root 解法一開始的想法 題目敘述很簡短,但基本上就是除了root以外,左葉子樹的成員都對調 但學會了上一題遞迴的概念後,這題幾乎是秒解,但還是有考慮不周到的地方 我一開始的想法,就是一樣透過遞迴的方式,一開始就 traverse 到樹葉,碰到樹葉後,再將他們的左右child進行對調,之後一路fuction return 回去,然後回傳一開始原先的root即可 我一開始的思路會是下面這樣 123456789101112131415161718TreeNode *BT::invertTree(TreeNode* root){ TreeNode *tmp = 0; TreeNode *current = root; if (root == nullptr) { return nullptr; } if(current->left != NULL && curr...
二元樹的最大深度 | Easy | LeetCode#104. Maximum Depth of Binary Tree
題目敘述 題目難度: Easy 題目敘述: 題目給定一個Binary Tree 的 Root,要求這棵二元樹的最大深度 最大深度即 root 到樹葉的最遠距離 解法一開始的想法一開始的想法只有停留在 Traversal 本身,所以寫了 Inorder, Preorder, Postorder 甚至是 Level-order,都還是沒有太多想法… 這次是看了提示後才寫出來,並且了解到我自己對Recursive 的不熟練 我的解法123456789101112131415161718192021/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), ri...
從並行計算到聯邦式學習 | 學習筆記
甚麼是並行計算?現在的深度神經網路模型具有大量的參數,模型大也意味著計算量變大 Big Model + Big Data -> Huge computation cost ! 單一GPU進行一年的計算量,可以透過20 個 GPU 一次進行計算來實現,來減少花費的時間成本 Linear Predictor未完待續 聯邦式學習最好先具備並行計算和分散式機器學習的基礎。可以參考下面這系列影片:https://www.youtube.com/watch?v=gVcnOe6_c6Q&t=124s 背景 問題背景: Google 想要透過使用者行動裝置上的資料來訓練模型。 可能的解決辦法: 蒐集使用者資料,上傳到某個集中式學習平台去訓練模型 面臨的挑戰: 使用者拒絕上傳資料,尤其是機敏資料到 Google 的伺服器 這樣的問題情境也發生在個人隱私保護很嚴格的歐美企業或是醫療環境中 分散式學習 以及 聯邦學習 一次迭代的過程: worker node 向 parameter 索取parameter server 回傳 parameter worker n...
刷題必會知識 | 樹 (Tree) | 進階實作篇 | LeetCode 筆記
In-Order Traversal by Parent Field在前一篇介紹 Tree 的文章 中應該有發現,我們在實作 Binary Tree Node 的時候有宣告一個 TreeNode *parent 指標,但卻沒有使用。 我們在實踐 Inorder Traversal 也可以透過 Parent Field來去進行,若要善用 *parent 進行 Traversal 需要提及兩個重要函式: InorderSuccessor() : 以 inorder 順序尋找 (LVR) 進行 Traversal 的 下一個 node InorderPredecessor(): 以 inorder 順序尋找 (LVR) 進行 Traversal 的 前一個 node 這裡提到的概念會與之後的 BST(Binary Search Tree) 有關聯 在實作這兩個函式來實踐 Inorder Traversal 之間還有幾項前置作業必須先完成: 在 main() 中將不同節點的 *parent 之間串接起來 在 class BinartTree 中定義六個成員函式 123456...
刷題必會知識 | 樹 (Tree) | 基礎篇 | LeetCode 筆記
甚麼是 Tree? Tree 是一種常見的資料結構,直觀上來看樹狀結構代表階層式結構,像是族譜或是不同語言,語系的直系表就很常用樹來表示。 基本介紹 節點(Node): 樹的基本單位 根(Root): 樹狀結構的初始節點 分支(Branch): 節點與節點之間的分支 子節點(child): Root以外的節點 葉子節點(leaf): 沒有連接到其他子節點的節點,即樹狀結構的末端節點 樹的定義Tree的定義: 由一個或是數個節點組成的有限集合 並且 存在一個特定節點為Root 其餘節點可以分割成 $n >= 0$ 個沒有交集的(disjoint)集合 $T_{1},T_{2},…,T_{n}$ 為此Root的子樹(subtree) 這是一個遞迴的定義,對於上面圖中的節點A(Root),有兩個子樹,其樹根分別是節點B和節點C,樹中的每一個節點都是某個子樹的root,例如節點C 就包含了兩個子樹,它們的root分別是節點E 與節點F,而節點E與F為兩個沒有子樹的樹的樹根 A的子樹: $T_{1}(B,D)$, $T_{2}(C,E,F)$ B的子樹: ...
使用Stack來實現Queue | Easy | LeetCode#232. Implement Queue using Stacks
題目敘述 題目難度: Easy 題目敘述: 這題要求透過兩個 Stack 來實現一個Queue具有的基本操作,像是 push, peek, pop 以及 empty 題目也有提醒只可以使用標準 Stack 操作來實現 You must use only standard operations of a stack, which means only push to top, peek/pop from top, size, and is empty operations are valid. 解法一開始的想法這題跟 225. Implement Stack using Queues 其實是很類似的: Push 操作可以直接使用 <stack> 中的 push() STL 進行操作,重點會是實現 pop() 跟 peak(),由於Queue會是 FIFO,因此先進去Queue的會先出來,因此我們用Stack實作的時候等同於要優先將Stack的底部元素pop出來,這時候就需要第二個Stack進行暫存。 因此每當我們需要Pop時,都必須將最底部元素以外的資料...
使用Queue來實現Stack | Easy | LeetCode#225. Implement Stack using Queues
題目敘述 題目難度: Easy 題目敘述: 本題要求僅能使用兩個Queue來實現具有LIFO特性的Stack功能,需要能夠支援正常的Stack操作像是(push, pop, top, empty功能),題目額外提醒,我們只能使用常規queue操作,像是push to back, peek/pop from the front, size, isEmpty。 解法一開始的想法由於 我覺得Stack 跟 Queue最大的不同就是 FIFO 以及 LIFO,因此只要有辦法調整pop出來的順序即可,因此push可以正常push,但pop需要能夠回傳queue的尾端元素,top的話就直接用<queue> 的 back() 即可。 題目有說可以用兩個Queue,因此一個正常push進去的queue,如果要對它進行 pop,我們就需要依序將queue內資料Pop出來直到找到最後一個資料,但這些被pop出來的資料從Stack角度來看應該還要存在於Stack中,所以我們需要另一個queue將原先pop出來的元素存放起來。一旦原先的queue清空後,這時候可能使用者又會再進行pus...
刷題必會知識 | 佇列 (Queue) | LeetCode 筆記
甚麼是 Queue?Queue 也是一種資料結構,用於暫時儲存元素 ,它與 Stack 不同的是,它是屬於 FIFO (First-In-First-Out) 的特性,也就是先進入 Queue 的元素先出來,並且新元素會被加入到 Queue 的尾端。 通常 Queue 會被應用在需要具有順序一致性的系統中,像是網路封包處理、OS的 Process Schedule, BFS等等,反正就是想像是在排隊買票的感覺。 Queue 操作: 隊伍前方: front 隊伍後方: back 進入隊伍: push, 一定只能從 back 進入 離開隊伍: pop, 一定只能從 front 離開 Push(data): 將 data 從 back 放入Queue, 並更新成新的back,在Queue 中新增資料又稱 enqueue Pop: 把 front 指向的資料從Queue 中移除,並且更新front,從Queue中移除資料的行為又稱 dequeue getFront: 回傳 front 所指向的資料 getBack: 回傳 back 所指向的資料 IsEmpty: 檢查 Queue...
攀登富士山 | 行前準備與規劃紀錄 | 山屋預約
富士山之旅由於搶到御來光館的日期是在 7/16,因此這次攀登富士山的日期就選擇在今年(2024) 的 7/16 -7/17。 攀爬富士山大多都是呼籲預約山小屋,不要夜間單攻(彈丸登山) ,因此這次也是先以山屋預約日期為主,再去安排對應的爬山行程。另外富士山是一座活火山,隨時要注意火山活動相關的警報,這部分可以去富士山的官網查閱。 攀登路線吉田路線從富士山五合目出發,海拔為2300公尺,登山路線:5.8 公里。約耗時 5-7 個小時,也是山屋最多的路線,從7合目到9合目都有山屋,因此算是熱門的新手路線。也是我們這次的攀爬路線。 圖源:https://www.fujisan-climb.jp/trails/yoshida/index.html 除了吉田路線之外富士山還有其他攀登路線 須走路線吉田路線跟須走路線在本八合目後就會交會,因此人潮會開始便更多。這個路線最大的樂趣就是可以在下山途中體驗砂走,也就是在沙中滑行,實際上吉田路線的下山道也必須先從須走路線開始走,大概走道八合目才會又岔開 圖源: https://www.fujisan-clim...













