您的位置:首页 > 编程语言 > Go语言

算法设计Week13 LeetCode Algorithms Problem #64 Minimum Path Sum

2017-05-18 17:19 375 查看

题目描述:

Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.

Note: You can only move either down or right at any point in time.

题目分析:

本题其实也是前面#62题的变形,不过这回每一个格子都有了权重。延续#62中的想法,我们可以很容易得到状态方程:

pathSum[j] = grid[i - 1][j - 1] + min(pathSum[j - 1], pathSum[j])


在计算的过程中,需要注意两个特殊情况:一个是
i == 1
的时候,也就是在计算网格第一行的数值时,由于
pathSum[j]
均为0,而
pathSum[j - 1]
为已经计算出的权重。我们想要的是
pathSum[j - 1]
。因此这时的状态方程为

pathSum[j] = grid[i - 1][j - 1] + pathSum[j - 1]


而在
j == 1
的时候,由于由于
pathSum[j - 1]
均为0,而
pathSum[j]
为已经计算出的权重。我们想要的是
pathSum[j]
。因此这时的状态方程为

pathSum[j] = grid[i - 1][j - 1] + pathSum[j]


整个算法的时间复杂度为O(n2),空间复杂度为O(n)。

实现代码:

class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int row = grid.size();
int column = row ? grid[0].size() : 0;
vector<int> pathSum(column+1);
for(int i = 1; i <= row; i++){
for(int j = 1; j <= column; j++){
if(i == 1){
pathSum[j] = grid[i - 1][j - 1] + pathSum[j - 1];
}else if(j == 1){
pathSum[j] = grid[i - 1][j - 1] + pathSum[j];
}else{
pathSum[j] = grid[i - 1][j - 1] + min(pathSum[j - 1], pathSum[j]);
}
}
}
return pathSum[column];
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode 算法