1. 程式人生 > >leetcode64-最小路徑和

leetcode64-最小路徑和

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

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

示例:

輸入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
輸出: 7
解釋: 因為路徑 1→3→1→1→1 的總和最小。

解析:
動態規劃問題
對於矩陣中的任一位置,每次只能向下或者向右移動一步

  • 1.[0][0]位置的路徑為自己本身
  • 2.第一列的 每個位置的 路徑,等於它上面第一個數的路徑長度+自己本身
  • 3.第一行的 每個位置的 路徑,等於左面第一個數的路徑長度+自己本身
  • 4.除邊界外的數 路徑長度 = 自身 + min(左面第一個位置的路徑長度,上面第一個位置的路徑長度)
class Solution {
    public int minPathSum(int[][] grid) {
         int rows = grid.length;
        int cols = grid[0].length;
        int[][] weigh = new int[rows][cols];
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                if(i == 0 && j == 0){//1
                    weigh[i][j] = grid[i][j];
                }else if(i == 0){//2
                    weigh[i][j] = grid[i][j] + weigh[i][j-1];
                }else if(j == 0){//3
                    weigh[i][j] = grid[i][j] + weigh[i-1][j];
                }else{//4
                    weigh[i][j] = grid[i][j] + Math.min(weigh[i-1][j],weigh[i][j-1]);
                }
            }
        }
        return weigh[rows-1][cols-1];
    }
}