LeetCode 64「最小路径和」的 Go 实现,同样提供原地修改和一维滚动数组两个版本。
原地修改版(O(1) 额外空间)
funcminPathSum(grid[][]int)int{m,n:=len(grid),len(grid[0])// 第一行:只能从左向右累加forj:=1;j<n;j++{grid[0][j]+=grid[0][j-1]}// 第一列:只能从上向下累加fori:=1;i<m;i++{grid[i][0]+=grid[i-1][0]}fori:=1;i<m;i++{forj:=1;j<n;j++{grid[i][j]+=min(grid[i-1][j],grid[i][j-1])}}returngrid[m-1][n-1]}一维滚动数组版(不修改输入)
funcminPathSum(grid[][]int)int{n:=len(grid[0])dp:=make([]int,n)forj:=rangedp{dp[j]=math.MaxInt32}dp[0]=0for_,row:=rangegrid{dp[0]+=row[0]forj:=1;j<n;j++{dp[j]=row[j]+min(dp[j],dp[j-1])}}returndp[n-1]}复杂度:时间 O(m×n);原地版额外空间 O(1),滚动数组版 O(n)。
Go 细节:
- Go 的切片是引用传递,
minPathSum会直接修改调用方传入的grid,与 Python/Rust 一致(LeetCode 判题不受影响)。如需保护输入,滚动数组版本不修改grid min内置函数需 Go 1.21+;低版本用if a < b { return a }或math.Min(注意后者是float64)