返回

算法打卡 - Leetcode-20210524:路径总和III

前端

前言

LeetCode是一家专注于算法和编程问题的在线学习平台,为用户提供海量的算法题库和丰富的学习资源。LeetCode算法题库涵盖了从基础到高级的各个领域的算法问题,是算法爱好者和程序员提升算法技能的理想选择。

算法题解

今天我们来一起学习LeetCode上的路径总和III算法题。该算法题要求我们给定一个二叉树,它的每个结点都存放着一个整数值。我们需要找出路径和等于给定数值的路径总数。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

为了解决这个问题,我们可以使用动态规划的方法。动态规划是一种自底向上的算法设计方法,它将问题分解成子问题,并逐步求解这些子问题,最终得到整个问题的解。

在路径总和III算法题中,我们可以将子问题定义为:从给定节点出发,经过若干个结点,到达另一个结点的路径和为给定数值的路径总数。然后,我们可以通过递归或迭代的方法逐步求解这些子问题。

以下是路径总和III算法的详细步骤:

  1. 从根节点开始,对树进行深度优先搜索。
  2. 在每个结点,计算从该结点出发,经过若干个结点,到达另一个结点的路径和为给定数值的路径总数。
  3. 将该路径总数添加到结果中。
  4. 继续搜索该结点的子节点,直到所有的结点都被搜索完。

以下是路径总和III算法的Python实现:

def pathSum(root, targetSum):
    """
    :type root: TreeNode
    :type targetSum: int
    :rtype: int
    """
    if not root:
        return 0

    # 计算从根节点出发,经过若干个结点,到达另一个结点的路径和为给定数值的路径总数
    path_sum = 0
    stack = [(root, [root.val])]
    while stack:
        node, path = stack.pop()
        if not node.left and not node.right:
            if sum(path) == targetSum:
                path_sum += 1
        else:
            if node.left:
                stack.append((node.left, path + [node.left.val]))
            if node.right:
                stack.append((node.right, path + [node.right.val]))

    # 计算从根节点出发,经过若干个结点,到达另一个结点的路径和为给定数值的路径总数
    path_sum += pathSum(root.left, targetSum)
    path_sum += pathSum(root.right, targetSum)

    return path_sum

运行结果

以下是路径总和III算法在LeetCode上的运行结果:

Input: root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8
Output: 3
Explanation: The paths that sum to 8 are:
1. 10 -> 5 -> 3
2. 10 -> 5 -> 2 -> 1
3. 10 -> -3 -> 11

总结

路径总和III算法题是一道经典的算法题,它考察了我们对动态规划算法的理解和应用能力。通过这道算法题,我们可以学习到如何使用动态规划的方法解决复杂的问题。

希望这篇文章对您有所帮助。如果您有任何问题或建议,欢迎在评论区留言。