zoukankan      html  css  js  c++  java
  • [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 }
  • 相关阅读:
    标签的讲解
    属性分类
    LeetCode 003. 无重复字符的最长子串 双指针
    Leetcode 136. 只出现一次的数字 异或性质
    Leetcode 231. 2的幂 数学
    LeetCode 21. 合并两个有序链表
    象棋博弈资源
    acwing 343. 排序 topsort floyd 传播闭包
    Leetcode 945 使数组唯一的最小增量 贪心
    Leetcode 785 判断二分图 BFS 二分染色
  • 原文地址:https://www.cnblogs.com/strengthen/p/9783465.html
Copyright © 2011-2022 走看看