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];
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章