基本思路
对于每个点来说走到右下角的代价等于自身代价+min(下方点代价,右侧点代价)
m*n 题干描述不清 不知道是m行n列还是 长为m 宽为n leetcode-62里描述的就按照长宽走的,但是不重要,即使颠倒了,走法数和代价是一样的,只是写代码的时候要想清楚。这个代码是按照长为m 宽为n写的。
复杂度分析
时间复杂度 :O(mn)。遍历整个矩阵恰好一次。
空间复杂度 :O(mn)。额外的一个同大小矩阵。
升级写法
使用一维数组或者直接更改grid(不喜欢这种方法,改了输入总觉得很不道德)
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int m=grid[0].size();
int n=grid.size();
vector<vector<int>> path(n,vector<int>(m,0));
path[n-1][m-1]=grid[n-1][m-1];
for(int i=m-2;i>=0;i--)
path[n-1][i]=grid[n-1][i]+path[n-1][i+1];
for(int j=n-2;j>=0;j--)
path[j][m-1]=grid[j][m-1]+path[j+1][m-1];
for(int j=m-2;j>=0;j--)
for(int i=n-2;i>=0;i--)
path[i][j]=min(path[i+1][j],path[i][j+1])+grid[i][j];
return path[0][0];
}
};