Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions 112/memo.md
Original file line number Diff line number Diff line change
@@ -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: スタックを使った実装も一応書いておく
21 changes: 21 additions & 0 deletions 112/sol1.py
Original file line number Diff line number Diff line change
@@ -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
)
28 changes: 28 additions & 0 deletions 112/sol2.py
Original file line number Diff line number Diff line change
@@ -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