1. 程式人生 > >LeetCode#64. Minimum Path Sum

LeetCode#64. Minimum Path Sum

  • 題目:m*n的矩陣,每個元素為一個非負數,尋求從top left到bottom right的一條路徑,使得路徑經過的所有元素相加之和最少。
  • 難度:Medium
  • 思路:按照從左上到右下的順序,動態更新矩陣。
    動態方程一:grid[i][j] = min(grid[i][j-1], grid[i-1][j]) + grid[i][j]
    動態方程二:使用一個大小為n的一位陣列,儲存上一行的每一列元素,grid[j] = min(grid[j-1],grid[j]) + grid[i][j] grid[j-1]實際儲存的是當前元素的左邊元素值。
  • 程式碼:
    方法一:
public int minPathSum(int
[][] grid) { int m = grid.length;// row int n = grid[0].length; // column for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (i == 0 && j != 0) { grid[i][j] = grid[i][j] + grid[i][j - 1]; } else if (i != 0 && j == 0) { grid
[i][j] = grid[i][j] + grid[i - 1][j]; } else if (i == 0 && j == 0) { grid[i][j] = grid[i][j]; } else { grid[i][j] = Math.min(grid[i][j - 1], grid[i - 1][j]) + grid[i][j]; } } } return grid
[m - 1][n - 1]; }

方法二:

public int minPathSum(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        int[] result = new int[n];
        result[0] = grid[0][0];
        for(int i = 1; i < n; i++){
            result[i] = result[i-1] + grid[0][i];
        }
        for(int i = 1; i < m; i++){
            result[0] += grid[i][0];
            for(int j = 1; j < n; j++){
                result[j] = Math.min(result[j-1],result[j]) + grid[i][j];
            }
        }
        return result[n-1];
    }