0%

Leetcode 64 Minimum Path Sum

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.

Example:

1
2
3
4
5
6
7
8
Input:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
Output: 7
Explanation: Because the path 1→3→1→1→1 minimizes the sum.

1 动态规划1

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
vector<vector<int>> dist(grid.size(), vector<int>(grid.front().size(), -1));
return minPathSum(dist, grid, 0, 0);
}
private:
int minPathSum(vector<vector<int>>& dist, const vector<vector<int>>& grid, int i, int j, int delimiterMark = -1)
{
if(i == grid.size() - 1 && j == grid.front().size() - 1)
return grid[i][j];
if(!isLocationValid(grid, i, j))
return INT_MAX;
if(dist[i][j] != delimiterMark)
return dist[i][j];
int right = minPathSum(dist, grid, i, j+1);
int down = minPathSum(dist, grid, i+1, j);
dist[i][j] = min(right, down) + grid[i][j];
return dist[i][j];
}
bool isLocationValid(const vector<vector<int>>& grid, int i, int j)
{
return i < grid.size() && j < grid.front().size();
}
};

2 动态规划2

对于这个题, 可以直接将dist信息储存在grid中, grid遍历过的储存的就是dist, 没有遍历过的还是储存的原来的值. 这样不需要new一个二维数组.

依次计算(i,j)到(0,0)的距离, 返回grid[m-1][n-1]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
const int m = grid.size();
const int n = grid.front().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]);
}
}
return grid[m-1][n-1];
}
};