题目
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明: 每次只能向下或者向右移动一步。
示例:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
解题思路
使用动态规划,除了最后一列和最后一行,其他格子只能往下和往右走,所以很容易得出dp(i,j) = grid(i,j)+min(dp(i+1, j), dp(i, j+1)),这题是动态规划中的简单题目。
代码如下
class Solution {
public int minPathSum(int[][] grid) {
int n = grid.length, m = grid[0].length;
if(n == 0 || m == 0) return 0;
int[][] dp = new int[n][m];
dp[n-1][m-1] = grid[n-1][m-1];//终点
//最后一行只能往右走
for(int j = m-2; j >= 0; j--) dp[n-1][j] = grid[n-1][j] + dp[n-1][j+1];
//最后一列只能往下走
for(int i = n-2; i >= 0; i--) dp[i][m-1] = grid[i][m-1] + dp[i+1][m-1];
for(int i = n-2; i >= 0; i--) {
for(int j = m-2; j >= 0; j --) {
dp[i][j] = grid[i][j] + Math.min(dp[i+1][j], dp[i][j+1]);
}
}
return dp[0][0];
}
}
提交结果
成功
显示详情
执行用时 : 3 ms, 在Minimum Path Sum的Java提交中击败了98.59% 的用户
内存消耗 : 36.1 MB, 在Minimum Path Sum的Java提交中击败了99.82% 的用户