• [Swift]LeetCode120. 三角形最小路径和 | Triangle


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

    Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.

    For example, given the following triangle

    [
         [2],
        [3,4],
       [6,5,7],
      [4,1,8,3]
    ]
    

    The minimum path sum from top to bottom is 11 (i.e., 2 + 3 + 5 + 1 = 11).

    Note:

    Bonus point if you are able to do this using only O(n) extra space, where n is the total number of rows in the triangle.


    给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。

    例如,给定三角形:

    [
         [2],
        [3,4],
       [6,5,7],
      [4,1,8,3]
    ]
    

    自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。

    说明:

    如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。


    12ms

     1 class Solution {
     2     func minimumTotal(_ triangle: [[Int]]) -> Int {
     3         guard triangle.count > 0 && triangle[0].count > 0 else {
     4             return 0
     5         }
     6         let m = triangle.count, n = triangle[0].count
     7         var dp = triangle[m - 1]
     8         
     9         var j = m - 2
    10         while j >= 0 {
    11             let arr = triangle[j]
    12             for i in 0..<arr.count {
    13                 dp[i] = min(dp[i], dp[i + 1]) + arr[i]
    14             }
    15             
    16             j -= 1
    17         }
    18         
    19         return dp[0]
    20     }
    21 }

    16ms

     1 class Solution {
     2     func minimumTotal(_ triangle: [[Int]]) -> Int {
     3         if triangle.count == 1 {
     4             return triangle[0][0]
     5         }
     6         var lastLine = triangle.last!
     7         var sums = Array(repeating: 0, count:triangle.count-1)
     8         for i in stride(from: triangle.count-2, through:0, by:-1) {
     9             for j in 0..<triangle[i].count {
    10                 sums[j] = min(lastLine[j], lastLine[j+1]) + triangle[i][j]
    11             }
    12             lastLine = sums
    13         }
    14         return sums[0]
    15     }
    16 }

    44ms

     1 class Solution {
     2     func minimumTotal(_ triangle: [[Int]]) -> Int {
     3         guard triangle.count > 0 else {
     4             return 0
     5         }
     6         
     7         var dp = triangle.last!
     8         
     9         for i in stride(from: triangle.count - 2, through: 0, by: -1) {
    10             for j in 0...i {
    11                 dp[j] = min(dp[j], dp[j + 1]) + triangle[i][j]
    12             }
    13         }
    14         
    15         return dp[0]
    16     }
    17 }

    96ms

     1 class Solution {
     2     
     3     func minimumTotal(_ triangle: [[Int]]) -> Int {
     4         let m = triangle.count
     5         if m == 0 { return 0 }
     6         if m == 1 { return triangle[0][0] }
     7         var result = triangle //设result[i][j]是到ij的最小路径和
     8         
     9         for i in 1 ..< m {
    10             for j in 0 ... i {
    11                 if j == 0 {
    12                     result[i][j] = triangle[i][j] + result[i - 1][j]    
    13                 } 
    14                 else if j == i {
    15                     result[i][j] = triangle[i][j] + result[i - 1][j - 1]    
    16                 }
    17                 else {
    18                     result[i][j] = triangle[i][j] + min(result[i - 1][j], result[i - 1][j - 1])    
    19                 }
    20             }
    21         }
    22         
    23         
    24         return result[m - 1].min() ?? 0
    25     }
    26 }
  • 相关阅读:
    利用MySQL实现分布式锁,涉及到乐观锁和悲观锁的思想
    SpringIOC容器的使用
    Elasticsearch 入门实战(2)安装
    ODOO升级可能遇到问题
    标记接口(Marker interface)
    将Anaconda 中新建的虚拟环境添加到Jupyter notebook
    jupyter切换kernel 连接失败,请检查配置
    解决问题:Jupyter Notebook 无法切换内核
    【c语言】截取字符串小技巧
    C#学习日记04
  • 原文地址:https://www.cnblogs.com/strengthen/p/9953183.html
Copyright © 2020-2023  润新知