这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战
leetcode 最小路径和
给定一个包含非负整数的 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
解题:grid二维数组元素值都大于0,然后按右下方向移动的元素值相加的路径就是一种路径和,那么对于这种题目需要考虑所有路径,然后找到最小和的路径,可以使用动态规划,计算到达每一个元素的最小路径和,最后获取右下角元素值即可。因为每次移动的话只能向下或者向右移动一步,所以对于第一行的元素上方没有元素了,那么如果要到达第一行元素的位置就只能从其左边元素往右移动到达,所以就获取其左边一个元素的值与当前元素的值的和即为最小路径和。对于第一列的元素左边没有元素了,那么要达到第一列元素的位置就只能从其上方元素往下移动到达,所以可以获取其上边一个元素值加上当前元素的值就是到达当前元素的最小路径和了。那对于那些上方或者左方都有元素的位置,如果要到达这样一个位置是可以从其上方往下移动或者从其左方往下移动,当前元素值不变那就取上方元素和左方元素中值较小的一个元素来加上当前元素值即为当前的最小路径和。然后逐个计算要到达每一个元素位置所需的最小路径和,然后获取最后一个元素值就是总的最小路径和了。具体的定义一个二维数组dp和原数组grid大小一致,然后dp[i][j]位置元素就表示从grid[0][0]移动到达grid[i][j]位置的最小路径和。初始的db[0][0] = grid[0][0],然后遍历grid的第一行元素,那么当前元素[i][0]的最小路径和为dp[i-1][0]+grid[i][0]的值;然后遍历grid的第一列元素,那么当前元素[0][j]的最小路径和就是dp[0][j-1]+grid[0][j]的值;然后再遍历其余元素,那么i>0、j>0对于当前元素[i][j]的最小路径和就是min(dp[i−1][j],dp[i][j−1])+grid[i][j]的值。最后获取dp二维数组右下角元素值就是一条从左上角到右下角的最小路径和了。
class Solution {
public int minPathSum(int[][] grid) {
int rows = grid.length;
int columns = grid[0].length;
int[][] dp = new int[rows][columns];
dp[0][0] = grid[0][0];
for (int i = 1; i < rows; i++) {
dp[i][0] = dp[i - 1][0] + grid[i][0];
}
for (int j = 1; j < columns; j++) {
dp[0][j] = dp[0][j - 1] + grid[0][j];
}
for (int i = 1; i < rows; i++) {
for (int j = 1; j < columns; j++) {
dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
}
}
return dp[rows - 1][columns - 1];
}
}