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:

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

dp state transition: dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]

// Dynamic Programming
int minPathSum(vector<vector<int>>& grid) { // time: O(m * n); space: O(m * n)
    if (grid.empty() || grid[0].empty()) return 0;
    int m = grid.size(), n = grid[0].size();
    vector<vector<int> > sum(m, vector<int>(n, 0));
    for (int i = 0; i < m; ++i)
        sum[i][0] = grid[i][0] + (i >= 1 ? sum[i - 1][0] : 0);
    for (int j = 1; j < n; ++j)
        sum[0][j] = grid[0][j] + sum[0][j - 1];
    for (int i = 1; i < m; ++i) {
        for (int j = 1; j < n; ++j) {
            sum[i][j] = min(sum[i - 1][j], sum[i][j - 1]) + grid[i][j];
        }
    }
    return sum.back().back();
}
// Space Optimized Dynamic Programming
int minPathSum(vector<vector<int>>& grid) { // time: O(m*n); space: O(n)
    if (grid.empty() || grid[0].empty()) return 0;
    int m = grid.size(), n = grid[0].size();
    vector<int> dp(n, 0);
    for (int j = 0; j < n; ++j) dp[j] = grid[0][j] + (j > 0 ? dp[j - 1] : 0);
    for (int i = 1; i < m; ++i) {
        dp[0] += grid[i][0];
        for (int j = 1; j < n; ++j) {
            dp[j] = min(dp[j], dp[j - 1]) + grid[i][j];
        }
    }
    return dp.back();
}
int minPathSum(vector<vector<int>>& grid) { // time: O(m*n); space: O(m*n)
    if (grid.empty() || grid[0].empty()) return 0;
    int m = grid.size(), n = grid[0].size();
    vector<vector<int> > sum(m, vector<int>(n, 0));
    for (int i = 0; i < m; ++i) {
        for (int j = 0; j < n; ++j) {
            if (i == 0)
                sum[0][j] = grid[0][j] + (j > 0 ? sum[0][j - 1] : 0);
            else if (j == 0)
                sum[i][0] = grid[i][0] + (i > 0 ? sum[i - 1][0] : 0);
            else
                sum[i][j] = min(sum[i - 1][j], sum[i][j - 1]) + grid[i][j];
        }
    }
    return sum.back().back();
}
int minPathSum(vector<vector<int>>& grid) { // time: O(m*n); space: O(n)
    if (grid.empty() || grid[0].empty()) return 0;
    int m = grid.size(), n = grid[0].size();
    vector<int> sum(n, 0);
    for (int i = 0; i < m; ++i) {
        for (int j = 0; j < n; ++j) {
            if (i == 0)
                sum[j] = grid[i][j] + (j > 0 ? sum[j - 1] : 0);
            else if (j == 0)
                sum[j] += grid[i][j];
            else
                sum[j] = min(sum[j], sum[j - 1]) + grid[i][j];
        }
    }
    return sum.back();
}

Last updated

Was this helpful?