leetcode 64. 最小路径和
题意
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小
解题思路
使用动态规划的思想,用 path[m][n]
表示m x n 网格。
- 我们可以容易确定和
起始位置
同一行或同一列的所有网格的最小路径和为该网格前的所有网格(包含该网格)的数值相加,譬如path[0][j] = grid[0][0] + grid[0][1] + ... + grid[0][j]
。 - 我们知道意一个网格
path[i][j]
的最小路径和是该网格上边的网格path[i-1][j]
和该网格左边的网格path[i][j-1]
中的较小值再加上当前网格的数值grid[i][j]
,因此得到递推式path[i][j] = min{path[i-1][j], path[i][j-1]} + grid[i][j]
。
代码
class Solution {
public int minPathSum(int[][] grid) {
int m = grid.length;
int n = grid[0].length;
int[][] path = new int[m][n];
path[0][0] = grid[0][0];
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (j > 0 && i == 0)
{
path[0][j] = grid[0][j] + path[0][j - 1];
}
if (j == 0 && i > 0)
{
path[i][0] = grid[i][0] + path[i - 1][0];
}
if (j > 0 && i > 0)
{
if (path[i - 1][j] <= path[i][j - 1])
{
path[i][j] = grid[i][j] + path[i - 1][j];
}
else
{
path[i][j] = grid[i][j] + path[i][j - 1];
}
}
}
}
return path[m - 1][n - 1];
}
}