【剑指offer】AB35 三角形最小路径和 [Go语言]

125 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

描述

给定一个正三角形数组,自顶到底分别有 1,2,3,4,5...,n 个元素,找出自顶向下的最小路径和。

每一步只能移动到下一行的相邻节点上,相邻节点指下行种下标与之相同或下标加一的两个节点。

数据范围:三角形数组行数满足1≤n≤200,数组中的值都满足。
例如当输入[[2],[3,4],[6,5,7],[4,1,8,3]]时,对应的输出为11
所选的路径如下图所示:

image.png

思路

这是一道比较常规的动态规划的题目,我们可以,维持一个二维列表dp,来记录下最短的值

AC Code

func minTrace( triangle [][]int ) int {
    dp := make([][]int,len(triangle))
    for i,_ := range dp {
        dp[i] = make([]int,i+1)
    }
    for i,_ := range triangle{
        for j,_ := range triangle[i]{
(1)            dp[i][j] = math.MaxInt32
        }
    }
(2)    dp[0][0]=triangle[0][0]
    for i:=1;i<len(triangle);i++{
        for j:=0;j<len(triangle[i]);j++{
(3)            if j<len(triangle[i-1]){ // 上一个
(4)                dp[i][j]=min(dp[i][j],dp[i-1][j]+triangle[i][j])
            }
(5)            if j>0{// 左上
                dp[i][j]=min(dp[i][j],dp[i-1][j-1]+triangle[i][j])
            }
        }
    }
    minRes := dp[len(dp)-1][0]
    for i:=0;i<len(dp[len(dp)-1]);i++{
        if minRes > dp[len(dp)-1][i] {
(6)            minRes = dp[len(dp)-1][i]
        }
    }
    return minRes
}

func min(a , b int) int{
    if a > b {
        return b
    }
    return a
}
  • (1) 先将所有的数初始为最大值。
  • (2) 第一个元素为矩阵的第一个元素。
  • (3) 一行一行进行遍历,从左到右进行遍历。
  • (4) 从上面的元素与现在的元素相加再和自身进行对比。
  • (5) 如果j>0,我们还要进行与左上进行对比。
  • (6) 取到获取最小值