力扣题目
解题思路
java代码
力扣题目:
给定一个包含非负整数的 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
解题思路:
主要思路:
使用动态规划的方法来解决。创建一个与输入矩阵相同大小的二维 dp
数组来保存到达每个位置的最小路径和。
-
首先初始化
dp
数组的第一行和第一列,因为在这两种情况下,路径只能从一个方向过来。- 第一行的每个位置的最小路径和是其左边位置的路径和加上当前位置的值。
- 第一列的每个位置的最小路径和是其上方位置的路径和加上当前位置的值。
-
对于其他位置,其最小路径和是其上方位置和左方位置的最小路径和中的较小值加上当前位置的值。
代码解释:
-
m
和n
分别表示矩阵的行数和列数。 -
dp
二维数组用于保存中间计算结果。 -
初始化部分:
- 通过两个循环分别初始化第一行和第一列的
dp
值。
- 通过两个循环分别初始化第一行和第一列的
-
核心计算部分:
- 通过两层嵌套循环计算其余位置的
dp
值,通过比较上方和左方的dp
值来确定当前位置的最小路径和。
- 通过两层嵌套循环计算其余位置的
java代码:
package org.example.mouth7.today23; public class Leetcode64 { public static void main(String[] args) { int[][] grid = {{1, 3, 1}, {1, 5, 1}, {4, 2, 1}}; System.out.println(minPathSum(grid)); } public static int minPathSum(int[][] grid) { int m = grid.length; int n = grid[0].length; int[][] dp = new int[m][n]; 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 j = 1; j < n; j++) { dp[0][j] = dp[0][j - 1] + grid[0][j]; } 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]; } }
更多详细内容同步到公众号,感谢大家的支持!
每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项