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]
View Code

改进后的代码不会超时,

# 执行用时 :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)
View Code

 

posted on 2019-12-07 18:28  吃我一枪  阅读(322)  评论(0编辑  收藏  举报

导航