LeetCode 64. 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.

Example:
Input:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
Output: 7
Explanation: Because the path 1→3→1→1→1 minimizes the sum.

解答:

本题与LeetCode 63 题采用相同的思路和解法,都是动态规划。
假设题中的矩阵:
LeetCode 64. Minimum Path Sum 最小路径和_第1张图片
解题思路为:

  1. 创建二维数组sum,其中数组中以每个小格为单位,存储路径到达该单元格时,最小的路径数值和
  2. 起始状态为左上角的单元格。路径值即为数组grid中该单元格的值
  3. 第一行中,到达每个单元格的路径值 = 当前单元格的值 + 左一个单元格内路径值
  4. 第一列中,到达每个单元格的路径值 = 当前单元格的值 + 上一个单元格内路径值
    (如下图,为上面二维数组的路径值的起始状态)
    LeetCode 64. Minimum Path Sum 最小路径和_第2张图片
  5. 因为路径只能向右或者向下走,则其余单元格的路径值 = 上方或左边单元格的路径最小值 + 当前单元格的值
    LeetCode 64. Minimum Path Sum 最小路径和_第3张图片
    实现代码如下:
class Solution {
    public int minPathSum(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        int[][] sum = new int[m][n];
        for(int i=0; i<m; i++) {
            for(int j=0; j<n; j++) {
                if(i==0 && j==0) {
                    sum[i][j] = grid[i][j];
                }else if(i==0 && j>0) {
                    sum[i][j] = grid[i][j] + sum[i][j-1];
                }else if(j==0 && i>0) {
                    sum[i][j] = grid[i][j] + sum[i-1][j];
                }else {
                    sum[i][j] = Math.min(sum[i-1][j], sum[i][j-1]) + grid[i][j];
                }                
            }
        }
        return sum[m-1][n-1];
    }
}

你可能感兴趣的:(LeetCode)