题目描述:
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];
}
};