【leetcode-python-35】437. 路径总和 III
参考大佬版1(49.94%)
双层递归。
pathSum记录路径数=以根节点开始的路径数+以左右子树为整体的路径数(不一定以左右子树的根节点开始)。
dfs记录以根节点开始的路径数,只要找到一条就+1,找不到就递归地-root.val往下继续找。
这样每一条都找过且都得算,可能有重复的,太慢了。那就递归+散列表,会更高效,具体代码请参考题解区sammy思路。
注:参考题解区sammy思路。
class Solution(object):
def pathSum(self, root, sum):
"""
:type root: TreeNode
:type sum: int
:rtype: int
"""
if not root:
return 0
return self.dfs(root,sum) + self.pathSum(root.left, sum) + self.pathSum(root.right, sum)
def dfs(self,root,path):
if not root:
return 0
path -= root.val
return (1 if path == 0 else 0) + self.dfs(root.left,path) + self.dfs(root.right,path)
参考大佬版2(82.23%)
用sumlist存下每走一步,以根为开始的当前路径下所有出现的和值。
dfs表示整体中sum出现的总个数。return(count出的以根为开始的路径中sum的个数)+左右子树为整体的总个数。
其中append可以用[list1]+[list2]这种形式实现。
注:参考题解区Orust思路。
class Solution(object):
def pathSum(self, root, sum):
"""
:type root: TreeNode
:type sum: int
:rtype: int
"""
def dfs(root,sumlist):
if not root:
return 0
sumlist = [num+root.val for num in sumlist]
sumlist.append(root.val)
return sumlist.count(sum) + dfs(root.left,sumlist)+dfs(root.right,sumlist)
return dfs(root,[])
新手入坑,多多包涵~~