437路径总和III
题目: 给定一个二叉树,它的每个结点都存放着一个整数值。找出路径和等于给定数值的路径总数。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
来源: https://leetcode-cn.com/problems/path-sum-iii/
法一: 自己的代码, 代码超时,原因是计算res的时候,没有用前面的结果,而是每次都重新计算一遍,这个时候一定要把要计算的结果作为参数进行传递,每次都对参数进行计算有几个结果符合.会大大减少计算的次数
# Definition for a binary tree node. class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None class Solution: def pathSum(self, root: TreeNode, su: int) -> int: results = [0] def judge(res): a = [] while res: a.append(res.pop()) if sum(a) == su: results[0] = results[0] + 1 def recursion(root,res): if root is None: return res.append(root.val) # 每次都对res进行求和判断 judge(res[:]) recursion(root.left, res) recursion(root.right, res) res.pop() recursion(root,res=[]) return results[0]
改进后的代码不会超时,
# 执行用时 :180 ms, 在所有 python3 提交中击败了93.22% 的用户 # 内存消耗 :33.4 MB, 在所有 python3 提交中击败了9.56%的用户 class Solution: def pathSum(self, root: TreeNode, su: int) -> int: results = [0] def recursion(root,res): if root is None: return # 先计算有几个满足条件的,再传res.切不可先传过去后计算,那样的话慢了一步, res = [root.val+i for i in res] + [root.val] results[0] = results[0] + res.count(su) # res是可变对象,并且是直接传过去了,但由于res = [root.val+i for i in res] + [root.val] # 中对res重新进行赋值了,所以函数结束调用后,res中的内容并未改变 recursion(root.left, res) recursion(root.right,res) recursion(root,res=[]) return results[0] if __name__ == '__main__': duixiang = Solution() root = TreeNode(5) a = TreeNode(4) b = TreeNode(11) c = TreeNode(2) d = TreeNode(2) root.left = a a.left = b b.left = c b.right = d su = 22 a = duixiang.pathSum(root, su) print(a)