Triangle (go語言)

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章