演算法作業 week 8

第一題

  • 第一次 bound 23 demo

  • 超過 bound 不符合 demo

  • 第二次 bound 20 demo

  • 最後 bound 在 9(最後答案) demo

    好沒效率喔

第二題

  • matrix demo

  • order demo

  • tree demo

第三題∞

  • original matrix

    i \ j1234567
    1083930650
    206637171226
    3291190125
    432836649080
    5321567028
    6085842890
    7180005813

    lower bound: 3+4+16+7+25+3+26+7+1+4 = 96

  • with arc 6-7 (reduce row 6 and column 7)

    i \ j123456
    10839306
    2066371712
    329119012
    4328366490
    53215670
    71800058

    lower bound: 96 + 0 = 96

  • without arc 6-7 (matrix 同 original)

    lower bound: 96 + 0 + 5 = 101

  • with arc 3-5 (reduce row 3 and column 5)

    i \ j12346
    108396
    20663712
    43283660
    532170
    718000

    lower bound: 96 + 0 = 96

  • without arc 3-5 (matrix 同 with arc 6-7)

    lower bound: 96 + 1 + 17 = 114

第四題

class Solution:
    def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        if root is None:
            return None

        val = root.val
        left = self.invertTree(root.right)
        right = self.invertTree(root.left)

        return TreeNode(val, left, right)
  • 題目連結:226. Invert Binary Tree - LeetCode
  • LeetCode 執行結果: demo
  • 語言:Python
  • 花費時間:5 分鐘
  • 完成程度:自己想
  • 其他:滿直覺的想法,用 DC 然後把 leftright 互換,若發現節點是 leaf 的 left 或 right 就回傳 None 終止。

延伸練習

找出第 k 小的值

class Solution:
    def kthSmallest(self, root: Optional[TreeNode], k: int) -> int:
        stack = []

        def goDeeper(root):
            if root is None:
                return None

            val = root.val
            left = goDeeper(root.left)

            stack.append(val)
            if len(stack) == k:
                return None

            right = goDeeper(root.right)

            return None

        goDeeper(root)
        return stack[k - 1]
  • 題目連結:230. Kth Smallest Element in a BST - LeetCode
  • LeetCode 執行結果: demo
  • 語言:Python
  • 花費時間:20 分鐘
  • 完成程度:看完四個提示
  • 其他:使用中序依序把當前最小值加入 stack 裡面,然後 stack 大小為 k 時,就終止程式,最後 stack[k - 1] 就會是答案了!(k 是 1-indexed)

二元樹中序遍歷

class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        answer = []
        def traversal(root):
            if root is None:
                return None

            traversal(root.left)
            answer.append(root.val)
            traversal(root.right)

            return None

        traversal(root)
        return answer
  • 題目連結:94. Binary Tree Inorder Traversal
  • LeetCode 執行結果: demo
  • 語言:Python
  • 花費時間:5 分鐘
  • 完成程度:自己想
  • 其他:一樣用 DC 遍歷,然後因為是中序,所以在 traversal 左右邊的中間把 val 加入到 answer,最後回傳 answer

本週心得

這次作業光是畫圖就要花好多時間了,真佩服想出這些演算法的人!

考量到大家的壓力,所以這次作業只剩一題,個人覺得有點少,就自己找來做幾題了!

參考