1. 题目

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.

2. 思路

从右下往左上移动,每次计算当前点到右下的最短。
f[i, j] = grid[i, j] + min(f[i+1,j], f[i,j+1])

下边和右边两条边线进行特殊处理。

3. 代码

class Solution {
public:
    // 同63题的递归或迭代方案, 避免超时直接采用迭代实现
    int minPathSum(vector<vector<int>>& grid) {
        int m = grid.size();
        if (m == 0) { return 0; }
        int n = grid[0].size();
        if (n == 0) { return 0; }
        
        int sol[m+1][n+1];
        sol[m-1][n] = 0;
        sol[m][n-1] = 0;
        int int_max = numeric_limits<int>::max();
        for (int i = m-2; i >= 0; i--) {
            sol[i][n] = int_max;
        }
        
        for (int j = 0; j < n - 1; j++) {
            sol[m][j] = int_max;
        }
        
        for (int i = m-1; i >= 0; i--) {
            for (int j = n-1; j >= 0; j--) {
                sol[i][j] = grid[i][j] + min(sol[i+1][j], sol[i][j+1]);
            }
        }
        return sol[0][0];
    }
};

knzeus
72 声望28 粉丝

行万里路,读万卷书