路径总和 III - Leetcode
Sum of paths III - Leetcode
给定目标总和,我们需要找到路径数,即路径总数。又给出了,路径不一定要从根节点开始。
对于这个问题,我找到了一个解决方案。我也能看懂85%的解法
解决方案:
def pathCounter(node,currPath,_sum):
if node is None:
return 0
path = []
currPath.append(node.data)
pathSum , pathCount = 0, 0
#Unable to understand below for loop
for i in range(len(currPath)-1,-1,-1):
pathSum +=currPath[i]
path.append(currPath[i])
if pathSum==_sum:
pathCount+=1
#print(path)
pathCount+= pathCounter(node.left,currPath,_sum)
pathCount+= pathCounter(node.right,currPath,_sum)
del currPath[-1]
return pathCount
我遇到的问题是,我无法理解为什么 for 循环设置为逆序而不是正常顺序迭代?
这对问题有何影响?
原因是当你在正向执行循环时,if
条件将检查代表 prefix 的总和 currPath
,而不是 postfix.
由于递归 在 currPath
末尾追加 节点值,因此重复检查前缀和是没有意义的(因为已经检查过了较早前)。前缀和总是包括根节点(的值),而我们不能假设根节点必须包含在解决方案中。
递归的目的是在所有和检查中包含新访问的节点,并且由于该新节点位于currPath
的末尾,总和应从末尾向后累加。
例如:
假设树中有一条向下的路径,其值为:10 - 5 - 3 - 1,我们需要求和 8。然后在第一级递归中,我们访问 10,接下来我们访问 5。此时我们验证这些总和:
* 5
* 5 + 10
都没有给出匹配项,所以我们更深入地重复并访问 3。现在我们检查这些总和:
* 3
* 3 + 5 => It's a match!
* 3 + 5 + 10
如果在这个阶段我们会做一个正向循环,我们会检查这些总和:
* 10
* 10 + 5
* 10 + 5 + 3
None 会匹配,我们永远不会检查 不 包含根的任何总和。
给定目标总和,我们需要找到路径数,即路径总数。又给出了,路径不一定要从根节点开始。
对于这个问题,我找到了一个解决方案。我也能看懂85%的解法
解决方案:
def pathCounter(node,currPath,_sum):
if node is None:
return 0
path = []
currPath.append(node.data)
pathSum , pathCount = 0, 0
#Unable to understand below for loop
for i in range(len(currPath)-1,-1,-1):
pathSum +=currPath[i]
path.append(currPath[i])
if pathSum==_sum:
pathCount+=1
#print(path)
pathCount+= pathCounter(node.left,currPath,_sum)
pathCount+= pathCounter(node.right,currPath,_sum)
del currPath[-1]
return pathCount
我遇到的问题是,我无法理解为什么 for 循环设置为逆序而不是正常顺序迭代?
这对问题有何影响?
原因是当你在正向执行循环时,if
条件将检查代表 prefix 的总和 currPath
,而不是 postfix.
由于递归 在 currPath
末尾追加 节点值,因此重复检查前缀和是没有意义的(因为已经检查过了较早前)。前缀和总是包括根节点(的值),而我们不能假设根节点必须包含在解决方案中。
递归的目的是在所有和检查中包含新访问的节点,并且由于该新节点位于currPath
的末尾,总和应从末尾向后累加。
例如:
假设树中有一条向下的路径,其值为:10 - 5 - 3 - 1,我们需要求和 8。然后在第一级递归中,我们访问 10,接下来我们访问 5。此时我们验证这些总和:
* 5
* 5 + 10
都没有给出匹配项,所以我们更深入地重复并访问 3。现在我们检查这些总和:
* 3
* 3 + 5 => It's a match!
* 3 + 5 + 10
如果在这个阶段我们会做一个正向循环,我们会检查这些总和:
* 10
* 10 + 5
* 10 + 5 + 3
None 会匹配,我们永远不会检查 不 包含根的任何总和。