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
动态规划题,算是简单的,就简要提一下。
- dp[i][j]表示到达(i,j)的最短路径值
- 更新方程:
dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
- 注意初始化
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:动态规划专题