題目: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)
}