class Solution {
public int minPathSum(int[][] grid) {
int m = grid.length, n = grid[0].length;
for(int i = 1; i < m; i++) {
grid[i][0] += grid[i - 1][0];
}
for(int i = 1; i < n; i++) {
grid[0][i] += grid[0][i - 1];
}
for (int r = 1; r < m; r++) {
for (int c = 1; c < n; c++) {
grid[r][c] += Math.min(grid[r - 1][c], grid[r][c - 1]);
}
}
return grid[m - 1][n - 1];
}
}
共以下 17 个回答
class Solution {
public int minPathSum(int[][] grid) {
int dp[][] = new int[grid.length][grid[0].length];
dp[0][0]=grid[0][0];
for(int i=1;i<grid.length;i++){
dp[i][0]=dp[i-1][0]+grid[i][0];
}
for(int i=1;i<grid[0].length;i++){
dp[0][i]=dp[0][i-1]+grid[0][i];
}
for(int i=1;i<grid.length;i++){
for(int j=1;j<grid[0].length;j++){
dp[i][j] =grid[i][j]+Math.min(dp[i-1][j],dp[i][j-1]);
}
}
return dp[grid.length-1][grid[0].length-1];
}
}
时间复杂度:O(mn)
空间复杂度:O(mn)
“`java
class Solution {
public int minPathSum(int[][] grid) {
//dp[i][j]表示从grid[0][0]到grid[i][j]的最小路径,则结果就是dp[m-1][n-1]
//dp[i][j] = Math.min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
//当i为0时,只有一条路径
int m = grid.length;
int n = grid[0].length;
//优化成一维数组的话,dp[i] = Math.min(dp[i – 1], dp[i]) + grid[i][j];
int[] dp = new int[n];
dp[0] = grid[0][0];
for (int j = 1; j < n; j++) { dp[j] = dp[j - 1] + grid[0][j]; } for (int i = 1; i < m; i++) { for (int j = 0; j < n; j++) { if (j == 0) { dp[j] = dp[j] + grid[i][j]; } else { dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j]; } } } return dp[n - 1]; } }
时间复杂度:O(mn)
空间复杂度:O(mn)
c++实现
class Solution {>& grid) {
public:
int minPathSum(vector<vector
int N=210;
int n=grid[0].size();
int m=grid.size();
if(m<0 || n<0)
return 0;
int dp[N][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 i=1;i<n;i++)
dp[0][i]=dp[0][i-1]+grid[0][i];
for(int i=1;i<m;i++)
for(int j=1;j<n;j++)
dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j];
return dp[m-1][n-1];
}
};
MY【思路】DP思想,dp[i][j]代表从grid[0][0]走到grid[i][j]的最大路径,使用的中间变量可以优化为一维
【复杂度】时间复杂度O(mn),空间复杂度O(m)/O(n)
使用滚动数组
动态规划
时间:O(mn)
空间:O(1),题目grid不计入
“`C++>& grid) {
int minPathSum(std::vector
int m = grid.size();
int n = grid[0].size();
}
“`
思路:动态规划
时间复杂度:O(mn) 空间复杂度:O(mn)
时间复杂度是O(mn)
空间复杂度是O(mn)
二维数组
一维数组
c++实现动态规划>& grid) {
int minPathSum(vector<vector
int line = grid[0].size();
int row = grid.size();
int dp[row][line];
dp[0][0] = grid[0][0];
for(int i = 1;i<row;i++)
{
dp[i][0] = grid[i][0]+dp[i-1][0];
}
for(int i = 1;i<line;i++)
{
dp[0][i] = grid[0][i]+dp[0][i-1];
}
for(int i = 1;i<row;i++)
{
for(int j = 1;j<line;j++)
{
dp[i][j] = min(dp[i-1][j],dp[i][j-1])+grid[i][j];
}
}
return dp[row-1][line-1];
}
时间复杂度:O(n)
空间复杂度:O(n)
时间复杂度O(mn)