您的位置:首页 > 其它

leetcode Minimum Path Sum

2014-11-08 23:26 483 查看
题目:还是类似于之前两题,这里给定的m*n矩阵是每个数字都有值的。求的从头到尾的最小sum是多少。还是用动态规划求。初始化的时候是先计算第一行和第一列。假设给定的数据如下:



那么初始化后为:



那么再定位要处理的数字到i=1和j=1处,如表中的数字2处。这个时候更新是更加它加上它的左边或者上边的较小的值。更新一次后为:



一次类推可以将所有的更新完,最后输出grid[m-1][n-1]就可以了。

class Solution {
public:
int minPathSum(vector<vector<int> > &grid)
{
//if (grid.size() == 0) return 0;
int m = grid.size(), n = grid[0].size();
int i =1, j = 1;
while(j<n) { grid[0][j]+=grid[0][j-1]; j++;}
while(i<m) { grid[i][0]+=grid[i-1][0]; i++;}
i = 1; j = 1;
for (; i < m; ++i)
for (j =1 ; j < n; ++j) // 记得j重新赋值1
{
grid[i][j] += min(grid[i-1][j], grid[i][j-1]);
}
return grid[m-1][n-1];
}
};


2015/03/25:

class Solution {
public:
int minPathSum(vector<vector<int> > &grid) {
if (grid.size() == 0) return 0 ;
int m = grid.size(), n = grid[0].size();
for (int i = 1; i < m; ++i)
grid[i][0] += grid[i-1][0];
for (int j = 1; j < n; ++j)
grid[0][j] += grid[0][j-1];
for (int i = 1; i < m; ++i)
for (int j = 1; j < n; ++j){
grid[i][j] = min(grid[i-1][j], grid[i][j-1]) + grid[i][j];
}
return grid[m-1][n-1];
}
};


python:

class Solution:
# @param grid, a list of lists of integers
# @return an integer
def minPathSum(self, grid):
for i in range(1, len(grid)):
grid[i][0] += grid[i-1][0]
for i in range(1, len(grid[0])):
grid[0][i] += grid[0][i-1]
for i in range(1, len(grid)):
for j in range(1, len(grid[0])):
grid[i][j] = min(grid[i-1][j], grid[i][j-1]) + grid[i][j]
return grid[len(grid)-1][len(grid[0])-1]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: