leetcode 64. 最小路径和

leetcode 64. 最小路径和


题意

给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

示例:

输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小


解题思路

使用动态规划的思想,用 path[m][n] 表示m x n 网格。

  1. 我们可以容易确定和 起始位置 同一行或同一列的所有网格的最小路径和为该网格前的所有网格(包含该网格)的数值相加,譬如 path[0][j] = grid[0][0] + grid[0][1] + ... + grid[0][j]
  2. 我们知道意一个网格 path[i][j] 的最小路径和是该网格上边的网格 path[i-1][j] 和该网格左边的网格 path[i][j-1] 中的较小值再加上当前网格的数值 grid[i][j],因此得到递推式 path[i][j] = min{path[i-1][j], path[i][j-1]} + grid[i][j]

代码
class Solution {
    public int minPathSum(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        int[][] path = new int[m][n];
        
        path[0][0] = grid[0][0];
        for (int i = 0; i < m; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (j > 0 && i == 0)
                {
                    path[0][j] = grid[0][j] + path[0][j - 1];
                }
                if (j == 0 && i > 0)
                {
                    path[i][0] = grid[i][0] + path[i - 1][0];
                }
                if (j > 0 && i > 0)
                {
                    if (path[i - 1][j] <= path[i][j - 1])
                    {
                        path[i][j] = grid[i][j] + path[i - 1][j];
                    }
                    else
                    {
                        path[i][j] = grid[i][j] + path[i][j - 1];
                    }
                }
            }
        }
        
        return path[m - 1][n - 1];
    }
}

你可能感兴趣的:(leetcode,leetcode,Java)