diff --git a/112/memo.md b/112/memo.md new file mode 100644 index 0000000..870b037 --- /dev/null +++ b/112/memo.md @@ -0,0 +1,18 @@ +# 112. Path Sum +[リンク](https://leetcode.com/problems/path-sum/description/) + +- sol1.py: 再帰で書いたが少し遅い + +- https://github.com/SuperHotDogCat/coding-interview/pull/37#discussion_r1665891252 +> これ、引き算先にしちゃって、 +- これはできた + +- https://github.com/naoto-iwase/leetcode/pull/29/changes#r2455081026 + - パスを保存する状況を聞かれる可能性 + - 解答が良さそう +> そうですね、通ったノードのその時点の和を記録するsetまたは辞書を持つようにし、ゴールの葉からスタートに向かって再びBFS/DFSするのが(空間)計算量が節約できて良さそうですね。 + +> さらに、そのようなpathの総数/pathを全部知りたい場合は、1回目の前向きの探索をearly returnなしで完遂し、和の記録も通った回数を辞書で記録しておくのが良さそうに思います。 + + +- sol2.py: スタックを使った実装も一応書いておく diff --git a/112/sol1.py b/112/sol1.py new file mode 100644 index 0000000..cd6a0ef --- /dev/null +++ b/112/sol1.py @@ -0,0 +1,21 @@ +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, val=0, left=None, right=None): +# self.val = val +# self.left = left +# self.right = right +class Solution: + def is_leaf(self, node): + if node is None: + return False + return node.left is None and node.right is None + + def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool: + if root is None: + return False + remaining = targetSum - root.val + if self.is_leaf(root): + return remaining == 0 + return self.hasPathSum(root.left, remaining) or self.hasPathSum( + root.right, remaining + ) diff --git a/112/sol2.py b/112/sol2.py new file mode 100644 index 0000000..4425070 --- /dev/null +++ b/112/sol2.py @@ -0,0 +1,28 @@ +from collections import deque + + +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, val=0, left=None, right=None): +# self.val = val +# self.left = left +# self.right = right +class Solution: + def is_leaf(self, node): + if node is None: + return False + return node.left is None and node.right is None + + def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool: + frontier = deque() + frontier.append((root, 0)) + while frontier: + node, current_sum = frontier.pop() + if node is None: + continue + current_sum += node.val + if self.is_leaf(node) and current_sum == targetSum: + return True + for child in [node.left, node.right]: + frontier.append((child, current_sum)) + return False