题目: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)
题目来自leecode。作者给出了自己的实现,相比leecode中的实现,作者更关注如何让人更容易理解。所以使用了递归,但不管是递归方式还是循环方式,基本逻辑都是一样的,理解了递归的逻辑,也就容易看懂leecode中循环方式的逻辑了。
题目的翻译与解释:给定一个三角形矩阵,从顶向下,逐行选区一个数(节点)组成一个路径,这个路径上的每个数(节点)相加的值为这条路径的值,求最小的路径值。在这个路径中某一行的节点必须与下一行的节点相邻(比如第三行的5与第四行的1和8相邻)。
刚才提到“从顶向下”,与此相反,在解决问题时,采用了自下向上的角度。将一个四维的矩阵转化为一个等价的三维矩阵。直到递归到只剩一行。
暂时只给出go语言实现。
package main
import "log"
var triangleValue = [][]int{
{2},
{3, 4},
{6, 5, 7},
{4, 1, 8, 3},
}
func main() {
retVal := shrink(triangleValue)
if len(retVal[0]) == 1{
log.Println("路径的值为:",retVal[0][0])
}else{
log.Println("数据非法",retVal)
}
}
func min(n1 int, n2 int) int {
if n1 < n2 {
return n1
}
return n2
}
func shrink(triangle [][]int) [][]int {
if len(triangle) == 1 {
return triangle
}
lastRowIndex := len(triangle) - 1
secondLastRowIndex := len(triangle) - 2
lastRow := triangle[lastRowIndex]
for i := 0; i < len(lastRow)-1; i++ {
minVal := min(lastRow[i], lastRow[i+1])
triangle[secondLastRowIndex][i] += minVal
}
triangle = triangle[:lastRowIndex]
return shrink(triangle)
}