-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathSolution0064.java
31 lines (29 loc) · 1.38 KB
/
Solution0064.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// 64. 最小路径和
/*
动态规划:
1、题目:给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。
2、题目简化:求从 (0,0) 到达 (m-1,n-1) 位置的最小路径和
3、定义dp数组:本题可以直接在原数组操作。grid[i][j] 表示到达 (i,j) 位置的最小路径和
4、初始化:
1)二维dp数组不用扩容,直接根据dp数组的定义就可以直观地对应进行初始化
2)首行首列的路径和进行累加初始化
5、状态转移方程:grid[i][j] += Math.min(grid[i - 1][j], grid[i][j - 1]); 即上方或左方的最小路径和
6、遍历顺序:两个for循环遍历二维dp数组每个位置,根据状态转移方程计算该位置的最小路径和并填表,直到终点,获得结果
*/
class Solution {
public int minPathSum(int[][] grid) {
int n = grid.length, m = grid[0].length;
for (int i = 1; i < n; i++) {
grid[i][0] += grid[i - 1][0];
}
for (int j = 1; j < m; j++) {
grid[0][j] += grid[0][j - 1];
}
for (int i = 1; i < n; i++) {
for (int j = 1; j < m; j++) {
grid[i][j] += Math.min(grid[i - 1][j], grid[i][j - 1]);
}
}
return grid[n - 1][m - 1];
}
}