Minimum path sum

一次做對!好感動

。題目假設

給一個 m*n 矩陣,元素不為負數,求出和為最短的路徑,只能往右或往下

。重要問題

要怎樣在矩陣內行走,邊界條件

。直覺

要設定 cost

。解決方法可行性

一開始是想每次都往最小的走,但一定不行啊,因為當前比較小不代表後面也比較小

後來轉而想,對於每個元素,他有可能被選為路徑可能是從左邊或上面來

只要紀錄從 min(左邊, 上面) ,那就等於記住這條路的最小 cost,那把矩陣掃過後,f[m-1][n-1] 最右下元素就是最小路徑

。解決方案

。資料結構

二維陣列

。複雜度

O(n^2)

。遇到的困難點、想錯的地方

邊界條件要注意

public int minPathSum(int[][] grid) {
    if (grid == null || grid.length == 0) {
        return Integer.MAX_VALUE;
    }

    int m = grid.length;
    int n = grid[0].length;
    int f[][] = new int[m][n];
    f[0][0] = grid[0][0];

    for (int i=0; i<m; i++) {
        for (int j=0; j<n; j++) {
            //possible from left and not from top
            if (j-1 >= 0 && i == 0) {
                f[i][j] = grid[i][j] + f[i][j-1];
            }
            //possible from left and from top
            if (j-1 >= 0 && i != 0) {
                f[i][j] = grid[i][j] + Math.min(f[i][j-1], f[i-1][j]);
            }
            //possible from top not from left
            if (i-1 >= 0 && j == 0) {
               f[i][j] = grid[i][j] + f[i-1][j]; 
            }
        }
    }
    return f[m-1][n-1];
}

results matching ""

    No results matching ""