题目链接:
https://leetcode.cn/problems/minimum-path-sum/
以下是使用Go语言实现外观数列问题的代码:
func minPathSum(grid [][]int) int {
m, n := len(grid), len(grid[0])
// 初始化二维切片
dp := make([][]int, m)
for i := range dp {
dp[i] = make([]int, n)
}
// dp[i][j] 表示从起点到 (i,j) 点的最小路径和
// 初始值为 (0,0) 点的值
dp[0][0] = grid[0][0]
// 处理第一列
for i := 1; i < m; i {
dp[i][0] = dp[i-1][0] grid[i][0]
}
// 处理第一行
for j := 1; j < n; j {
dp[0][j] = dp[0][j-1] grid[0][j]
}
// 状态转移方程
for i := 1; i < m; i {
for j := 1; j < n; j {
dp[i][j] = min(dp[i-1][j], dp[i][j-1]) grid[i][j]
}
}
// 返回终点的最小路径和
return dp[m-1][n-1]
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
执行用时:8 ms, 在所有 Go 提交中击败了62.01%的用户
内存消耗:4.2 MB, 在所有 Go 提交中击败了34.80%的用户
通过测试用例:61 / 61
解题思路:
首先,我们定义二维切片 dp,其中 dp[i][j] 表示从起点到 (i,j) 点的最小路径和。初始值为 (0,0) 点的值 grid[0][0]。
然后,我们处理第一列和第一行。对于第一列的每个位置 (i,0),路径只能由上面的位置 (i-1,0) 向下移动一步到达,因此 dp[i][0] = dp[i-1][0] grid[i][0];对于第一行的每个位置 (0,j),路径只能由左边的位置 (0,j-1) 向右移动一步到达,因此 dp[0][j] = dp[0][j-1] grid[0][j]。
接下来,我们考虑其他位置的状态转移方程。对于 (i,j) 点,它可以从上面的点 (i-1,j) 或左边的点 (i,j-1) 转移而来,因此 dp[i][j] = min(dp[i-1][j], dp[i][j-1]) grid[i][j]。最终,dp[m-1][n-1] 即为终点的最小路径和。
时间复杂度为 O(mn),空间复杂度为 O(mn)。
,