• [Swift]LeetCode437. 路径总和 III | Path Sum III


    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/9783465.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    You are given a binary tree in which each node contains an integer value.

    Find the number of paths that sum to a given value.

    The path does not need to start or end at the root or a leaf, but it must go downwards (traveling only from parent nodes to child nodes).

    The tree has no more than 1,000 nodes and the values are in the range -1,000,000 to 1,000,000.

    Example:

    root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8
    
          10
         /  
        5   -3
       /     
      3   2   11
     /    
    3  -2   1
    
    Return 3. The paths that sum to 8 are:
    
    1.  5 -> 3
    2.  5 -> 2 -> 1
    3. -3 -> 11

    给定一个二叉树,它的每个结点都存放着一个整数值。

    找出路径和等于给定数值的路径总数。

    路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

    二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。

    示例:

    root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8
    
          10
         /  
        5   -3
       /     
      3   2   11
     /    
    3  -2   1
    
    返回 3。和等于 8 的路径有:
    
    1.  5 -> 3
    2.  5 -> 2 -> 1
    3.  -3 -> 11

    40ms
     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     public var val: Int
     5  *     public var left: TreeNode?
     6  *     public var right: TreeNode?
     7  *     public init(_ val: Int) {
     8  *         self.val = val
     9  *         self.left = nil
    10  *         self.right = nil
    11  *     }
    12  * }
    13  */
    14 class Solution {
    15     
    16     func pathSum(_ root: TreeNode?, _ sum: Int) -> Int {
    17         var dict = [Int: Int]()
    18         dict[0] = 1
    19         return getNum(root, 0, sum, &dict)
    20     }
    21     
    22     func getNum(_ rootNode: TreeNode?, _ curSum: Int, _ target: Int, _ dict: inout [Int: Int]) -> Int {
    23         guard let root = rootNode else {
    24             return 0
    25         }
    26         var tempSum = curSum
    27         tempSum += root.val
    28         var res = dict[tempSum-target] ?? 0
    29         dict[tempSum] = (dict[tempSum] ?? 0) + 1
    30         print(tempSum)
    31  
    32         res += getNum(root.left, tempSum, target, &dict) + getNum(root.right, tempSum, target, &dict)
    33         dict[curSum+root.val] = (dict[curSum+root.val] ?? 0) - 1
    34         return res
    35     }
    36 }

    44ms

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     public var val: Int
     5  *     public var left: TreeNode?
     6  *     public var right: TreeNode?
     7  *     public init(_ val: Int) {
     8  *         self.val = val
     9  *         self.left = nil
    10  *         self.right = nil
    11  *     }
    12  * }
    13  */
    14 class Solution {
    15     
    16     func pathSum(_ root: TreeNode?, _ sum: Int) -> Int {
    17         var dict = [Int: Int]()
    18         dict[0] = 1
    19         return getNum(root, 0, sum, &dict)
    20     }
    21     
    22     func getNum(_ rootNode: TreeNode?, _ curSum: Int, _ target: Int, _ dict: inout [Int: Int]) -> Int {
    23         guard let root = rootNode else {
    24             return 0
    25         }
    26         var tempSum = curSum
    27         tempSum += root.val
    28         var res = dict[tempSum-target] ?? 0
    29         dict[tempSum] = (dict[tempSum] ?? 0) + 1
    30     
    31         res += getNum(root.left, tempSum, target, &dict) + getNum(root.right, tempSum, target, &dict)
    32         dict[curSum+root.val] = (dict[curSum+root.val] ?? 0) - 1
    33         return res
    34     }
    35 }

    52ms

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     public var val: Int
     5  *     public var left: TreeNode?
     6  *     public var right: TreeNode?
     7  *     public init(_ val: Int) {
     8  *         self.val = val
     9  *         self.left = nil
    10  *         self.right = nil
    11  *     }
    12  * }
    13  */
    14 class Solution {
    15     
    16     func pathSum(_ root: TreeNode?, _ sum: Int) -> Int {
    17         guard let root = root else { return 0 }
    18         
    19         var result = 0
    20         var dict = [Int : Int]()
    21         dfs(root, sum, 0, [0 : 1], &result)
    22         
    23         return result
    24     }
    25     
    26     func dfs(_ root: TreeNode?, _ target: Int, _ prev: Int, _ dict: [Int : Int], _ result: inout Int) {
    27         guard let root = root else { return }
    28         
    29         let sum = root.val + prev
    30         if let freq = dict[sum - target] {
    31             result += freq
    32         }
    33         
    34         var newDict = dict
    35         newDict[sum] = (dict[sum] ?? 0) + 1
    36         
    37         dfs(root.left, target, sum, newDict, &result)
    38         dfs(root.right, target, sum, newDict, &result)
    39     }
    40 }

    84ms

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     public var val: Int
     5  *     public var left: TreeNode?
     6  *     public var right: TreeNode?
     7  *     public init(_ val: Int) {
     8  *         self.val = val
     9  *         self.left = nil
    10  *         self.right = nil
    11  *     }
    12  * }
    13  */
    14 class Solution {
    15     
    16     func pathSum(_ root: TreeNode?, _ sum: Int) -> Int {
    17         guard let root = root else { return 0 }
    18         
    19         var result = 0
    20         var dict = [Int : Int]()
    21         dfs(root, sum, 0, [0 : 1], &result)
    22         
    23         return result
    24     }
    25     
    26     func dfs(_ root: TreeNode?, _ target: Int, _ prev: Int, _ dict: [Int : Int], _ result: inout Int) {
    27         guard let root = root else { return }
    28         
    29         let sum = root.val + prev
    30         if let freq = dict[sum - target] {
    31             print("sum:(sum), cur:(root.val), prev:(prev)")
    32             result += freq
    33         }
    34         
    35         var newDict = dict
    36         newDict[sum] = (dict[sum] ?? 0) + 1
    37         
    38         dfs(root.left, target, sum, newDict, &result)
    39         dfs(root.right, target, sum, newDict, &result)
    40     }
    41 }

    172ms

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     public var val: Int
     5  *     public var left: TreeNode?
     6  *     public var right: TreeNode?
     7  *     public init(_ val: Int) {
     8  *         self.val = val
     9  *         self.left = nil
    10  *         self.right = nil
    11  *     }
    12  * }
    13  */
    14 class Solution {
    15     func pathSum(_ root: TreeNode?, _ sum: Int) -> Int {
    16         
    17         guard let root = root else { return 0 }
    18         
    19         return numberOfPaths(root, sum) + pathSum(root.left, sum) + pathSum(root.right, sum)
    20     }
    21     
    22     func numberOfPaths(_ root: TreeNode?, _ sum: Int) -> Int {
    23         
    24         guard let root = root else { return 0 }
    25         
    26         let diff = sum - root.val
    27         let left = numberOfPaths(root.left, diff)
    28         let right = numberOfPaths(root.right, diff) 
    29         return  diff == 0 ? 1 + left + right : left + right
    30     }
    31 }
  • 相关阅读:
    python调用ggsci.exe程序
    confluence安装
    nginx优化
    ELKstack搭建
    zabbix 安装
    python requests
    小程序消息推送
    shell
    rar 解压
    ubuntu 安装部分设置U盘启动系统安装盘操作
  • 原文地址:https://www.cnblogs.com/strengthen/p/9783465.html
Copyright © 2020-2023  润新知