文章目录
- 题目描述
- 解题方法
- 动态规划
- 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
- 个人公众号
- 个人小游戏