题目
描述
给定一个 n * m 的矩阵 a,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,输出所有的路径中最小的路径和。
要求:空间复杂度 O(1),时间复杂度 O(nm)
思路
采用动态规划的思想,建立dp数组,先走横着的一条路和竖着的一条路,值会根据之前的dp数组保存的路径和+当前的值,然后考虑对角的位置,取dp临近值中小的一个+当前的值。最后返回dp数组的右下角值。
代码
python版本:
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param matrix int整型二维数组 the matrix
# @return int整型
#
class Solution:
def minPathSum(self , matrix: List[List[int]]) -> int:
# write code here
h = len(matrix)
w = len(matrix[0])
dp = [[0 for i in range(w)] for j in range(h)]
dp[0][0] = matrix[0][0]
for i in range(1, h):
dp[i][0] = dp[i-1][0] + matrix[i][0]
for j in range(1, w):
dp[0][j] = dp[0][j-1] + matrix[0][j]
for i in range(1, h):
for j in range(1, w):
min_value = min(dp[i-1][j], dp[i][j-1])
dp[i][j] = min_value + matrix[i][j]
return dp[h-1][w-1]
c++版本:
class Solution {
public:
/**
*
* @param matrix int整型vector<vector<>> the matrix
* @return int整型
*/
int minPathSum(vector<vector<int> >& matrix) {
// write code here
int mh = matrix.size();
int mw = matrix[0].size();
vector<vector<int>> dp(mh, vector<int>(mw, 0));
dp[0][0] = matrix[0][0];
for(int i=1; i<mw; i++){
dp[0][i] = dp[0][i-1] + matrix[0][i];
}
for(int j=1; j<mh; j++){
dp[j][0] = dp[j-1][0] + matrix[j][0];
}
for(int i = 1; i<mh; i++){
for(int j = 1; j<mw; j++){
int min_value = min(dp[i-1][j], dp[i][j-1]);
dp[i][j] = min_value + matrix[i][j];
}
}
return dp[mh-1][mw-1];
}
};