Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情
描述
给定一个正三角形数组,自顶到底分别有 1,2,3,4,5...,n 个元素,找出自顶向下的最小路径和。
每一步只能移动到下一行的相邻节点上,相邻节点指下行种下标与之相同或下标加一的两个节点。
数据范围:三角形数组行数满足1≤n≤200,数组中的值都满足。
例如当输入[[2],[3,4],[6,5,7],[4,1,8,3]]时,对应的输出为11
所选的路径如下图所示:
思路
这是一道比较常规的动态规划的题目,我们可以,维持一个二维列表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) 取到获取最小值