题目概述
解题思路
动态规划是解决这类问题的利器。如何构建递推公式呢?我们发现,如果斜着看这个数组,走到点(i, j)的最小代价,其实只和走到点(i-1, j)和点(i, j-1)有关。写成公式:
因此,我们只需要先求出矩阵左上角的元素,然后逐渐往右下角递推即可。这样的话,时空复杂度都是O()。
方法性能
示例代码
class Solution {
public:
int minPathSum(vector<vector<int>>& grid)
{
int min_res = 0, R = grid.size(), C = grid[0].size(), min_len = min(R, C), max_len = R + C - min_len;
for (int i = 1; i < R; ++i)
grid[i][0] += grid[i - 1][0];
for (int j = 1; j < C; ++j)
grid[0][j] += grid[0][j - 1];
for (int i = 1; i < R; ++i)
for (int j = 1; j < C; ++j)
grid[i][j] += min(grid[i][j - 1], grid[i - 1][j]);
return grid[R - 1][C - 1];
}
};