dp O(mn) time O(mn) space
需要注意边界条件
f[0][0] = grid[0][0]
f[0][j] = f[0][j - 1] + grid[0][j]
f[i][0] = f[i - 1][0] + grid[i][0]
f[i][j] = min(f[i - 1][j], f[i][j - 1]) + grid[i][j]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Solution { public: int minPathSum(vector<vector<int>>& grid) { if (grid.empty() || grid[0].empty()) return 0; int m = grid.size(), n = grid[0].size(); vector<vector<int>> f(m + 1, vector<int>(n + 1, INT_MAX)); f[1][0] = 0; for (int i = 1; i <= m; ++i) { for (int j = 1; j <= n; ++j) { f[i][j] = min(f[i - 1][j], f[i][j - 1]) + grid[i - 1][j - 1]; } } return f[m][n]; } };
|
O(mn) time O(n) space
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class Solution { public: int minPathSum(vector<vector<int>>& grid) { if (grid.empty() || grid[0].empty()) return 0; int m = grid.size(), n = grid[0].size(); vector<int> f(n + 1, INT_MAX); f[0] = 0; for (int i = 1; i <= m; ++i) { for (int j = 1; j <= n; ++j) { f[j] = min(f[j], f[j - 1]) + grid[i - 1][j - 1]; } f[0] = INT_MAX; } return f[n]; } };
|