LeetCode120. 三角形最小路径和(Python+Golang)
题目
给定一个三角形 triangle ,找出自顶向下的最小路径和。
每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。
题目分析
方法一:递归法(超时)
自上而下,存在重复子问题的计算
时间复杂度O(2n)
方法二:贪心算法(失败)
方法三:DP
自下而上
转移方程:DP[i,j] = min(DP[i+1,j]+DP(i+1,j+1))+ triangle[i,j]
时间复杂度 O(m*n)
Python实现(递归->超时)
class Solution:
def minimumTotal(self, triangle: List[List[int]]) -> int:
def dfs(i,j,triangle):
if i== len(triangle)-1:
return triangle[i][j]
return triangle[i][j]+min(dfs(i+1,j,triangle),dfs(i+1,j+1,triangle))
return dfs(0,0,triangle)
Python实现(DP)
class Solution:
def minimumTotal(self, triangle: List[List[int]]) -> int:
length = len(triangle)
# 行:自下而上
for i in range(2,length+1):
# 列: 自右而左
for j in range(i,length+1):
triangle[length-i][length-j] = triangle[length-i][length-j] + \
min(triangle[length-i+1][length-j],triangle[length-i+1][length-j+1])
return triangle[0][0]
Golang实现
// 由于GO没有int的Min的函数,因此我们得自己定义
func Min(x,y int) int {
if x<y{
return x
} else{
return y
}
}
func minimumTotal(triangle [][]int) int {
length := len(triangle)
// 列:自下而上
for i:=2;i<=length;i++{
// 行:自右而左
for j:=i;j<=length;j++{
triangle[length-i][length-j] = triangle[length-i][length-j]+ Min(triangle[length-i+1][length-j],triangle[length-i+1][length-j+1])
}
}
return triangle[0][0]
}