使用 Dokku 將 Web App 部署在 DigitalOcean

因為 Heroku 現在要收費了,原本放在上面用免費方案的 project 就需要找新的方法。於是找到了 Dokku,他的 GitHub page 介紹如下:

Docker powered mini-Heroku. The smallest PaaS implementation you’ve ever seen.

的確是很傳神,因為使用方法跟 Heroku 很像,基本上可以從 Heroku 無痛遷移,差別在你需要用自己的 VM & domain,配合 dokku 就可以在上面用 docker 管理你的 application,就像他的 about 寫的:

Binary Tree Level Order Traversal

題目
思路

  1. 一次一層很直覺想到廣先搜尋 (BFS),所以用 iterative 的做法來解
  2. 一次迴圈處理一層,並把下一層節點放入 stack 繼續在下次迴圈處理
    • stack 也是 list of list, 裡面的每個 list 都是一層節點

Binary Tree Inorder Traversal

題目
思路

  1. Inorder Traversal: 對任意節點來說,順序為 左子樹 -> 自己 -> 右子樹
  2. 可拆解為最小單位動作,即第一點,故使用遞迴

House Robber II

題目
思路

  1. House Robber 很像,只差在房子的排列變成頭尾相連,有沒有辦法把這題拆解,變成能用上第一版 House Robber 的解題方法?譬如把環形變回直排?
  2. 變成環形之後多出來的限制讓我們可以把這題分成以下三種情況:
    1. 搶第一個、不搶最後一個:加入第三種情況,等同於可以視為直排,但只考慮到倒數第二個
    2. 不搶第一個、搶最後一個:加入第三種情況,等同於可以視為直排,但從第二個開始考慮

遞迴的時間複雜度算法

快速解 (適用於遞迴函式內呼叫自己 > 1 次)

  1. 看這個遞迴函式呼叫自己幾次,假設呼叫了 x
  2. 看看這個函式的遞迴深度。也就是說這個函式的初始呼叫會需要經過幾次的呼叫自己才會再也沒有任何呼叫,每條路都停止在 base case (終止條件)
    • 舉例:可以先看看下面的詳細解,初始呼叫為 u_paths(0, 0),此時 u_paths(i + 1, j) 需要呼叫 m 次才會停,u_paths(i, j + 1) 需要呼叫 n 次才會停,所以總共呼叫 m + n 次才會停,此時遞迴深度 h = m + n
  3. 承上例,此時時間複雜度為 O(x^h)
  • 至少目前套用在幾個比較單純的遞迴式都成立,不確定複雜的是不是也成立

House Robber

題目
思路

  1. 可以把得出答案的過程拆解為最小可重複步驟,用遞迴來解
  2. Recursive case: 假設 index 為 i,由 index 0 搶到 i 可得的最大收穫為 inner_rob(i)。在位置 i, 可選擇搶或不搶:
    1. 不搶:最大收穫跟前一個點一樣,為 inner_rob(i - 1)
    2. 搶:代表前一個點一定是不搶,所以最大收穫為這個點的 money nums[i] 再加上前前個點的最大收穫 inner_rob(i - 2)
    • 所以 inner_rob(i) 為以上兩種情況取較大的那個

Unique Paths

題目
思路

  1. 每走一步都會是一個 unique path,到終點的路線是由每一步所組成的,所以可以用遞迴的方式來想,最小的可重複動作就是一步,點 (i, j) 到終點的 unique path count 就是 (i + 1, j) 和 (i, j + 1) 的 unique path count 的和

  2. 最小可重複動作 return u_paths(i + 1, j) + u_paths(i, j + 1)

Merge Two Binary Trees

題目

做法一:recursive - DFS

  1. 找出最小的可重複動作:merge 兩個 nodes

    • 題目給的 method 就可以用來做遞迴
  2. 假設 mergeTrees 已完成,實作此最小可重複動作

    1
    2
    3
    4
    root1.val += root2.val
    root1.left = self.mergeTrees(root1.left, root2.left)
    root1.right = self.mergeTrees(root1.right, root2.right)
    return root1

Balanced Binary Tree

題目

做法一

思路:

  1. 依照 height-balanced 的定義,需要符合每個node 的左右子樹高度差都不大於 1
  2. 假設有個 function height 可以回傳 node 的 height
    • 先不實作內容
  3. 使用這個 height 完成 isBalanced

Same Tree

題目
思路:

  1. 先用以樹來說較直觀的遞迴解
  1. 要比較所有相同位置的 node 的值是否一樣,可以把所有待比較的 node pair 丟到 stack 裡一一拿出來比較,全部比完都通過的話就是一樣的 tree
  2. 一個 pair 比較後會把下面的所有分支點繼續丟進 stack 等待比較,所以用 while stack: 只要有就繼續比,一直比到完
    • 此為廣先搜尋 (Breadth-First Search)
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×