class Solution {
public int minPathSum(int[][] grid) {
int m = grid.length;
int 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];
}
共以下 8 个回答
解题思路
– 定义dp[i][j] 在下标i和j的最小的路径上的数字总和
– dp[i][j]=min(d[i-1][j]+grid[i][j],d[i][j-1]+grid[i][j]),但是上述的dp[i][j]必须左边和上边有元素,即不能是左边和上边的
– 初始化[0][0],还有左边和上边的
【题解1】二维数组的dp
思路 :ans[i][j] = min(ans[i – 1][j], ans[i][j – 1]) + grid[i][j]
class Solution {
public int minPathSum(int[][] grid) {
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];
}
}
时间:O(mn)
空间:O(mn)
优化前
优化后
时间复杂度O(N∗M),空间复杂度O(N)。
class Solution {
public int minPathSum(int[][] grid) {
int m = grid.length;
int 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];
}
}
基础O(n)