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)
}

 

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