LeetCode 64 最小路径和

LeetCode 64 最小路径和

首页休闲益智路径转移更新时间:2024-05-01

题目链接:

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

,
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved