こんにちは
今回の学びは
・パターンによってO(N)かO(logN)になって良い。それでも立派な改善だ!
(時間配分は5分問題理解=restate&clarify 10分検討multip-sol, analysis, reasons 10分実装 20分振り返り の一文45分構成)をできればgoogle docで笑&真剣。
終始、わからないことは声にだして、明確にしていきましょう。
1,まずは入出力をしっかりおさえましょう。(問題を自分の言葉で復唱すること、わからないことをクリアにすると、前提も声にだすこと)
2,いくつかのソリューションを声にだして出してみましょう。(もちろんtime complexit, space complexityの分析や理由を付け加えて)
3,どれでいくか、一緒に決定しましょう。(理由付きでね、よろしく)
timespace analysis (時間とスペースの分析)は 〇〇です
最初はDFSの回答しかわからなかった。
高さからの公式で出すのは、わかったがそれをコードにはできなかった。なぜなら、何個欠けているのか?
それを判別するためには結局O(N)回るひつようがあるとおもった。
ところが、それでも良い、と言っているのが今回の問題です、それが最大の収穫となりました。
4、実装しましょう。
# Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def countNodes(self, root: TreeNode) -> int: if root is None: return 0 curr, leftn = root.left, 0 while curr: leftn += 1 curr = curr.left curr, rightn = root.right, 0 while curr: rightn += 1 curr = curr.right if leftn == rightn: # fully complete tree return 2 ** (leftn+1) - 1 else: return 1 + self.countNodes(root.left) + self.countNodes(root.right)
この動画が理解に役立ちました。
5、エッジケースとサンプルテストを忘れずに!
振り返り
「次のこの問題を解くばあい知っていればよい一つの事実とは?」
・パターンによってO(N)かO(logN)になって良い。それでも立派な改善だ!
まとめ
以上です