Minimum-Path-Sum——最小路径和
题目描述:
给定一个只含非负整数的m*n网格,找到一条从左上角到右下角的可以使数字和最小的路径。
样例 1:
输入: [[1,3,1],[1,5,1],[4,2,1]]
输出: 7
样例解释:
路线为: 1 -> 3 -> 1 -> 1 -> 1。
样例 2:
输入: [[1,3,2]]
输出: 6
解释:
路线是: 1 -> 3 -> 2
Notice
你在同一时间只能向下或者向右移动一步
AC代码:
1 public class Solution { 2 3 /** 4 * @param grid: a list of lists of integers 5 * @return: An integer, minimizes the sum of all numbers along its path 6 */ 7 public int minPathSum(int[][] grid) { 8 // write your code here 9 if (grid == null || grid.length == 0 || grid[0].length == 0) { 10 return 0; 11 } 12 13 int m = grid.length; 14 int n = grid[0].length; 15 16 // 坐标型动态规划 17 // 最后一步:每个点的路径之和只可能来自上面和左边 18 int[][] dp = new int[2][n]; // 代表(0, 0)到(i, j)的数字和最小的路径 19 20 // 时间复杂度:O(mn) 空间复杂度:O(mn) 21 // 为了降低空间复杂度,这里可以采用滚动数组 22 23 int now = 0, old = 1; 24 int top; 25 int left; 26 // 转移方程 27 for (int i = 0; i < m; i++) { 28 // 这里是滚动数组的最容易忽视的一点:考虑完一行之后才能滚动,不然会出错 29 // 更新 30 old = now; 31 now = 1 - now; 32 for ( int j = 0; j < n; j++) { 33 // 左上角的点 34 if (i == 0 && j == 0) { 35 // 初始化 36 dp[now][0] = grid[0][0]; 37 continue; 38 } 39 dp[now][j] = grid[i][j]; 40 // 判断上面是否有点 41 if (i > 0) { 42 // 上面有点 43 top = dp[old][j]; 44 } else { 45 // 这里设置为无穷大,是为了后面比较,因为是选最小的,反之如果选最大,这里 46 // 可以设置为无穷小 47 top = Integer.MAX_VALUE; 48 } 49 50 // 同理判断左边点是否存在 51 if (j > 0) { 52 left = dp[now][j - 1]; 53 } else { 54 left = Integer.MAX_VALUE; 55 } 56 57 // 比较上面点和左边点的值哪个更小,最后不要忘了加上当前点的值 58 if (top < left) { 59 dp[now][j] += top; 60 } else { 61 dp[now][j] += left; 62 } 63 } 64 } 65 66 return dp[now][n - 1]; 67 } 68 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能