[算法]LeetCode每日一题--64. 最小路径和(Java)

DailyChallenge

64. 最小路径和

20200723

难度:中等

题目描述

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

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

示例:

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

链接:https://leetcode-cn.com/problems/minimum-path-sum

Solution

动态规划题,算是简单的,就简要提一下。

  1. dp[i][j]表示到达(i,j)的最短路径值
  2. 更新方程:dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
  3. 注意初始化
class Solution {
    public int minPathSum(int[][] grid) {
        if(grid == null) return 0;
        int m = grid.length;
        if(m == 0) return 0;
        int n = grid[0].length;
        // dp[i][j]表示到达(i,j)的最短路径值
        int[][] dp = new int[m + 2][n + 2];
        // 初始化第一行和第一列
        dp[0][0] = grid[0][0];
        for(int i = 1; i < m; i++) dp[i][0] = dp[i - 1][0] + grid[i][0];
        for(int i = 1; i < n; i++) dp[0][i] = dp[0][i - 1] + grid[0][i];
        for(int i = 1; i < m; i++){
            for(int j = 1; j < n; j++){
                dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
            }
        }
        return dp[m - 1][n - 1];

    }
}


我的公众号:GitKid

暂时每日分享LeetCode,我在不断学习的过程中,公众号也在不断充实,欢迎大家扫码关注。

TODO:动态规划专题

微信公众号

你可能感兴趣的:(算法)