Description
https://leetcode.com/problems/minimum-path-sum/
给定一个
m
∗
n
m*n
m∗n的矩阵grid,矩阵所有元素都为非负整数,求从矩阵左上角到右下角的最短路径和,移动方向只能向右或向下
Solving Ideas
https://blog.csdn.net/qq_32767041/article/details/85928140
动态规划:
State:
dp[i][j]
: 从grid[0][0]
到grid[i][j]
的最短路径和
Initial State:
dp[0][0] = grid[0][0]
dp[i][0] = dp[i - 1][0] + grid[i][0] (i > 0)
dp[0][j] = dp[0][j - 1] + grid[0][j] (j > 0)
State Transition:
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j] (i > 0 && j > 0)
时间复杂度:
O
(
m
∗
n
)
O(m*n)
O(m∗n)
空间复杂度:
O
(
m
∗
n
)
O(m*n)
O(m∗n)
Solution
class Solution {
public int minPathSum(int[][] grid) {
if (grid == null || grid.length == 0 || grid[0].length == 0) return -1;
int m = grid.length, n = grid[0].length;
int[][] dp = new int[m][n];
dp[0][0] = grid[0][0];
for (int i = 1; i < m; i++) dp[i][0] = dp[i - 1][0] + grid[i][0];
for (int j = 1; j < n; j++) dp[0][j] += dp[0][j - 1] + grid[0][j];
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
}
}
return dp[m - 1][n - 1];
}
}
class Solution {
public int minPathSum(int[][] grid) {
if (grid == null || grid.length == 0 || grid[0].length == 0) return -1;
int m = grid.length, n = grid[0].length;
for (int i = 1; i < m; i++) grid[i][0] += grid[i - 1][0];
for (int j = 1; j < n; j++) grid[0][j] += grid[0][j - 1];
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
grid[i][j] += Math.min(grid[i - 1][j], grid[i][j - 1]);
}
}
return grid[m - 1][n - 1];
}
}