算法 25 Minimum Path Sum

题目:给出一个 m × n 的栅格,里面填着非负的数字。找到从左上角到右下角的最短(经过格子的数字之和最短)路径。
注意: 只能往右或者往下走。

思路:到同行的格子路径只有向右一条路。所以到达的值 = 到左边格子的值 + 本格子的值
到同列的也只有向下一条路,所以到达的值 = 到上边格子的值 + 本格子的值
所以到格子方法有两种,从左边来和从上边来,所以达到的值 = min(到左边格子的值,到上边格子的值) + 本格子的数

代码:

public int minPathSum(int[][] grid) {
    //得到行列长度
    int m = grid.length, n = grid[0].length;
    for(int i = 0; i < m; i++){
        for(int j = 0; j < n; j++){
            //求出第一行第一列栅格的最小值
            if(i == 0 && j != 0) grid[i][j] += grid[i][j-1];
            if(i != 0 && j == 0) grid[i][j] += grid[i-1][j];
            //其他栅格的最小值
            if (i != 0 && j != 0) grid[i][j] += Math.min(grid[i-1][j], grid[i][j-1]);

        }
    }
    //返回终点的最小值
    return grid[m-1][n-1];
}

时间复杂度:O(m*n) 空间复杂度O(min(m,n))

你可能感兴趣的:(算法 25 Minimum Path Sum)