(一)问题描述
64. 最小路径和 - 力扣(LeetCode)64. 最小路径和 - 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。 示例 1:[https://assets.leetcode.com/uploads/2020/11/05/minpath.jpg]输入:grid = [[1,3,1],[1,5,1],[4,2,1]]输出:7解释:因为路径 1→3→1→1→1 的总和最小。示例 2:输入:grid = [[1,2,3],[4,5,6]]输出:12 提示: * m == grid.length * n == grid[i].length * 1 <= m, n <= 200 * 0 <= grid[i][j] <= 200https://leetcode.cn/problems/minimum-path-sum/description/?envType=study-plan-v2&envId=top-100-liked
给定一个包含非负整数的 m x n
网格 grid
,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例 1:
输入:grid = [[1,3,1],[1,5,1],[4,2,1]] 输出:7 解释:因为路径 1→3→1→1→1 的总和最小。示例 2:
输入:grid = [[1,2,3],[4,5,6]] 输出:12
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 200
0 <= grid[i][j] <= 200
(二)解决思路
这道题和62. 不同路径思路是类似的,只不过由数个数变成了求和。还有一个问题是除了第一行和第一列元素,所有的元素都是由它的上一个元素或者左边一个元素走过来的,因此由递推公式dp[i][j]=Math.min(dp[i][j-1]+dp[i][j],dp[i-1][j]+dp[i][j]),所以这里要分情况讨论:
- 当i>0且j=0时,dp[i][0]=dp[i−1][0]+grid[i][0]。
- 当i=0且j>0时,dp[0][j]=dp[0][j−1]+grid[0][j]。
- 当i>0且j>0时,dp[i][j]=min(dp[i−1][j],dp[i][j−1])+grid[i][j]。
class Solution {
public int minPathSum(int[][] grid) {
int m = grid.length;
int n = grid[0].length;
int[][] dp = grid;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(i==0&&j!=0){
dp[i][j] = dp[i][j-1]+dp[i][j];
}
else if(i!=0&&j==0){
dp[i][j] = dp[i-1][j]+dp[i][j];
}
else if(i!=0&&j!=0){
dp[i][j]=Math.min(dp[i][j-1]+dp[i][j],dp[i-1][j]+dp[i][j]);
}
}
}
return dp[m-1][n-1];
}
}