文章目录
- 题目描述
- 解题方法
- 动态规划
- 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
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 200
0 <= grid[i][j] <= 200
解题方法
动态规划
这道题和第63题相似。
我们设 f ( i , j ) f(i, j) f(i,j)为机器人从左上角走到 ( i , j ) (i, j) (i,j)的最小数字总和,若机器人在 ( i , j ) (i,j) (i,j)处,则机器人上一步的位置在 ( i − 1 , j ) (i-1,j) (i−1,j)或者 ( i , j − 1 ) (i,j-1) (i,j−1)处,由此可推出,
- 当 i > 0 i > 0 i>0 且 j > 0 j > 0 j>0 时, f ( i , j ) = m i n ( f ( i − 1 , j ) , f ( i , j − 1 ) ) + g r i d [ i ] [ j ] f(i,j) = min(f(i-1,j), f(i,j-1)) + grid[i][j] f(i,j)=min(f(i−1,j),f(i,j−1))+grid[i][j]
- 当 i = 0 i = 0 i=0 且 j = 0 j = 0 j=0 时, f ( i , j ) = g r i d [ i ] [ j ] f(i,j) = grid[i][j] f(i,j)=grid[i][j]
- 当 i > 0 i > 0 i>0 且 j = 0 j = 0 j=0 时, f ( i , j ) = f ( i − 1 , j ) + g r i d [ i ] [ j ] f(i,j) = f(i-1,j) + grid[i][j] f(i,j)=f(i−1,j)+grid[i][j]
- 当 i = 0 i = 0 i=0 且 j > 0 j > 0 j>0 时, f ( i , j ) = f ( i , j − 1 ) + g r i d [ i ] [ j ] f(i,j) = f(i,j-1) + grid[i][j] f(i,j)=f(i,j−1)+grid[i][j]
java代码
public 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 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];
}
复杂度分析
时间复杂度: O ( m ∗ n ) O(m*n) O(m∗n),需要遍历一次数组。
空间复杂度: O ( m ∗ n ) O(m*n) O(m∗n),需要提供dp
数组的存储空间。
相似题目
[leetcode] 62. 不同路径
[leetcode] 63. 不同路径 II
- 个人公众号
- 个人小游戏