120.三角形最小路径和

126 阅读1分钟

题目:
给定一个三角形 triangle ,找出自顶向下的最小路径和。

每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。
算法:
方法一:动态规划
划分好情况即可

func minimumTotal(triangle [][]int) int {
	
	// dp[i]保存从三角形顶部,走到底部位置i的最短路径
	// dp[i] = min(dp[i], dp[i - 1])
	dp := make([]int, len(triangle))
	for i := range triangle {
		for j := len(triangle[i]) - 1; j >= 0; j-- {
			if j == 0 {
				dp[j] = dp[j] + triangle[i][j]
			} else if j == len(triangle[i]) - 1 && j > 0 {
				dp[j] = dp[j - 1] + triangle[i][j]
			} else if i > 0 {
				dp[j] = min(dp[j], dp[j - 1]) + triangle[i][j]
			}
		}
		// fmt.Println(dp)
	}
	ans := dp[0]
	for i := range dp {
		if dp[i] < ans {
			ans = dp[i]
		}
	}
	return ans
}

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}