目录
LCR099. 最小路径和
题目描述:
给定一个包含非负整数的 m x n
网格 grid
,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:一个机器人每次只能向下或者向右移动一步。
示例 1:
输入:grid = [[1,3,1],[1,5,1],[4,2,1]] 输出:7 解释:因为路径 1→3→1→1→1 的总和最小。
示例 2:
输入:grid = [[1,2,3],[4,5,6]] 输出:12
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 200
0 <= grid[i][j] <= 100
实现代码与解析:
dp
class Solution {
public int minPathSum(int[][] grid) {
int n = grid.length;
int m = grid[0].length;
int[][] f = new int[n][m];
for (int i = 0; i < n; i++) {
Arrays.fill(f[i], 0x3f3f3f3f);
}
f[0][0] = grid[0][0];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (i == 0 && j == 0) continue;
if (i >= 1) {
f[i][j] = Math.min(f[i][j], f[i - 1][j] + grid[i][j]);
}
if (j >= 1) {
f[i][j] = Math.min(f[i][j], f[i][j - 1] + grid[i][j]);
}
System.out.println( i + " " + j + " " + f[i][j]);
}
}
return f[n - 1][m - 1];
}
}
原理思路:
dp数组含义:f[i][j]表示到i,j这个位置的最小路径和。
由于只能向下和右走,所以我们只要计算f[i -1][j] 和 f[i][ j -1]取最大值即可。
这题主要是注意边界和初始化问题。
我这里只初始化了0,0位置,然后遍历特判。如果想写简单点可以初始化一行,然后先行后列遍历,或者初始化一列,然后先列后行遍历。