题目地址:
https://leetcode.com/problems/minimum-path-sum/
给定一个 m × n m\times n m×n矩阵 g g g,求从左上到右下所有路径中和最小的那条路径的和。每步只能向右或者向下走。
设 f [ i ] [ j ] f[i][j] f[i][j]表示从 g [ 0 ] [ 0 ] g[0][0] g[0][0]到 g [ i ] [ j ] g[i][j] g[i][j]的所有路径中,和最小的那个路径和,那么这条路径有两种可能,一种是从左边来,此时 f [ i ] [ j ] = f [ i ] [ j − 1 ] + g [ i ] [ j ] f[i][j]=f[i][j-1]+g[i][j] f[i][j]=f[i][j−1]+g[i][j],一种是从上边来,此时 f [ i ] [ j ] = f [ i − 1 ] [ j ] + g [ i ] [ j ] f[i][j]=f[i-1][j]+g[i][j] f[i][j]=f[i−1][j]+g[i][j];所以 f [ i ] [ j ] f[i][j] f[i][j]等于这两者较小者。我们可以直接在 g g g数组上面操作,以节省空间。代码如下:
class Solution {
public:
int minPathSum(vector<vector<int>>& g) {
int n = g.size(), m = g[0].size();
// 这里采取的是一行一行更新
for (int j = 1; j < m; j++) g[0][j] += g[0][j - 1];
for (int i = 1; i < n; i++) {
for (int j = 0; j < m; j++) {
if (j == 0)
g[i][j] += g[i - 1][j];
else
g[i][j] += min(g[i - 1][j], g[i][j - 1]);
}
}
return g[n - 1][m - 1];
}
};
时间复杂度 O ( m n ) O(mn) O(mn),空间 O ( 1 ) O(1) O(1)。