题目描述
// 64. 最小路径和
// 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径
// ,使得路径上的数字总和为最小。
// 说明:每次只能向下或者向右移动一步。
题解
// 动态规划
// 这题跟【剑指offer】47. 礼物的最大价值 是一模一样的,
// 就是一个选最大,一个选最小。
class Solution {
public int minPathSum(int[][] grid) {
int row = grid.length, col = grid[0].length;
if (row == 0 || col == 0)
return 0;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (i == 0 && j == 0)
continue;
else if (i != 0 && j == 0)
grid[i][j] += grid[i - 1][j];
else if (i == 0 && j != 0)
grid[i][j] += grid[i][j - 1];
else
grid[i][j] += Math.min(grid[i - 1][j], grid[i][j - 1]);
}
}
return grid[row - 1][col - 1];
}
}
// 或者这样
// 执行用时:3 ms, 在所有 Java 提交中击败了88.21%的用户
// 内存消耗:41.1 MB, 在所有 Java 提交中击败了55.99%的用户
class Solution {
public int minPathSum(int[][] grid) {
int row = grid.length;
int col = grid[0].length;
int[][] dp = new int[row][col];
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (i == 0 && j == 0)
dp[i][j] = grid[i][j];
else if (i == 0)
dp[i][j] = grid[i][j] + dp[i][j - 1];
else if (j == 0)
dp[i][j] = grid[i][j] + dp[i - 1][j];
else
dp[i][j] = grid[i][j] + Math.min(dp[i][j - 1], dp[i - 1][j]);
}
}
return dp[row - 1][col - 1];
}
}