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.


第一反应是一个DP的题,有一个递归的解法思路:

如果要算座标为[ i ][ j ]的最小值,那么应该是到座标[ i-1 ][ j ]的最小值和到座标[ i ][ j-1 ]的最小值中比较小的一个再加上[ i ][ j ]本身的值。如果直接这么实现,会有time limit exceed的错误,原因是有些点会被重复算到,比如算[ i ][ j-1 ]和[ i-1 ][ j ]都会去算[ i-1 ][ j-1 ]的值,于是用一个hash表来存储中间结果,结果通过了。


但是这道题可以更简单:

考虑在边上的点是只有一种情况的,就不需要取最小值,于是可以先把上面和左侧边上的值都算出来,然后再用一个两重循环,算出剩下所有的点的值,这样就节省了递归的开销。


public class Solution {
    public int minPathSum(int[][] grid) {
        if(grid==null){
            return 0;
        }
        int i=grid.length;
        int j=grid[0].length;
        for(int k=1;k<i;k++){
            grid[k][0] += grid[k-1][0];
        }
        for(int k=1;k<j;k++){
            grid[0][k] += grid[0][k-1];
        }
        int top,left,val;
        for(int m=1;m<i;m++){
            for(int n=1;n<j;n++){
                top = grid[m-1][n];
                left = grid[m][n-1];
                val = top>left?left:top;
                grid[m][n]+=val;
            }
        }
        return grid[i-1][j-1];
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章