LeetCode 64號問題 最小路徑和

xiaoxiunique發表於2018-11-21

給定一個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。

說明:每次只能向下或者向右移動一步。

示例:


輸入:[

  [1,3,1],

  [1,5,1],

  [4,2,1]

]輸出: 7解釋: 因為路徑 1→3→1→1→1 的總和最小。

複製程式碼

話題:動態規劃

解題思路, 將大問題, 分解為小問題, 解題關鍵 每次只能向下或者向右移動一步。, 由"說明"可得, 任意點的路徑總和等於元素上面的值 或 元素左邊的值 再加上本身, 就是路徑總和, 在兩個路徑和中取最小的路徑,得到的就是最小路徑

1.解題

image

如圖所示, 這是一個二維陣列, 我們要計算到達到達右下角的最小路徑和

第一步: 建立一個大小一樣的二維陣列, 並將新陣列的左上角與求解資料的值取為一樣

image

第二步: 計算出新陣列中, 第一行, 第一列的值(因為第一行沒有上一行, 第一列沒有上一列, 所以他們的值是確定的 , 可以計算得出)

image

依次類推, 算出第一行資料

image

依次類推, 算出第一列資料

image

至此, 我們已經求解出, 第一行和第一列的值, 然後我們要求解中間的值, 中間的值會存在兩種情況, 可能和上方的值相加, 可能和左邊的值相加, 需取其小的值

image

如圖紅色方框所示, 有兩種情況一種 總和為 1 + 10 = 11, 另一種情況我I 1 + 14 = 15, 在兩個值的情況下, 我們取較小的值  11

,由此類推, 我們便可以計算出所有的值

image

最後返回 資料的最後一項, 便是路徑最小的值

程式碼如下

    public int minPathSum(int[][] grid) {
        int[][] arr = grid;
        int width = grid[0].length;
        int height = grid.length;

        // 計算第一行
        for (int i = 1 ; i < width ; i ++) {
            arr[0][i] = grid[0][i] + arr[0][i - 1];
        }

        // 計算第一列
        for (int i = 1 ; i < height ; i++) {
            arr[i][0] = grid[i][0] + arr[i - 1][0];
        }

        // 計算剩餘的值
        for (int i = 1 ; i < height ; i ++) {
            for (int j = 1 ; j < width ; j ++) {
                arr[i][j] = min(grid[i][j] + arr[i - 1][j], grid[i][j] + arr[i][j - 1]);
            }
        }
        return arr[height - 1][width - 1];
    }

    // 獲取得到較小的數
    public int min(int num1, int num2) {

        return num1 > num2 ? num2 : num1;

    }

複製程式碼

連結地址

相關文章