题目: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。作者给出了自己的实现。
题目的翻译与解释:给定一个三角形矩阵,从顶向下,逐行选区一个数(节点)组成一个路径,这个路径上的每个数(节点)相加的值为这条路径的值,求最小的路径值。在这个路径中某一行的节点必须与下一行的节点相邻(比如第三行的5与第四行的1和8相邻)。
刚才提到“从顶向下”,与此相反,在解决问题时,采用了自下向上的角度。先只考虑倒数第二行到最后一行的路径。不管倒数第二行的哪个节点落在了这个路径上,它延伸到倒数第一行的时候,一定是延伸到该节点下方左右两个节点的其中一个,更确切的说是延伸到较小的那一个。这样将这个较小的节点与倒数第二行的相应节点相加,就把问题进行了一些简化,三角矩阵更小了,以此类推直到缩减为只有一层。就得到了答案。
go语言实现。
package main
import "log"
var triangleValue = [][]int{
{2},
{3, 4},
{6, 5, 7},
{4, 1, 8, 3},
}
func main() {
retVal := minimumTotal(triangleValue)
log.Println("路径的值为:",retVal)
}
func minimumTotal(triangle [][]int) int {
for len(triangle) > 1{
lastRowIndex := len(triangle) - 1
secondLastRowIndex := len(triangle) - 2
lastRow := triangle[lastRowIndex]
for j := 0; j < len(lastRow)-1; j++ {
minVal := min(lastRow[j], lastRow[j+1])
triangle[secondLastRowIndex][j] += minVal
}
triangle = triangle[:lastRowIndex]
}
return triangle[0][0]
}
func min(n1 int, n2 int) int {
if n1 < n2 {
return n1
}
return n2
}