最小路径和
难度:
标签:
题目描述
给定一个包含非负整数的 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
代码结果
运行时间: 72 ms, 内存: 20.1 MB
/**
* Problem Description:
* Given a grid of non-negative integers, find a path from the top-left corner to the bottom-right corner,
* such that the sum of the numbers along the path is minimized. You can only move either down or right at any point.
*/
import java.util.stream.IntStream;
public class Solution {
public int minPathSum(int[][] grid) {
// Get the dimensions of the grid
int m = grid.length;
int n = grid[0].length;
// Initialize a 1D array to store the minimum path sum up to each cell in the current row
int[] dp = new int[n];
// Fill the dp array using Java Streams
IntStream.range(0, m).forEach(i -> {
IntStream.range(0, n).forEach(j -> {
if (i == 0 && j == 0) {
// Starting point
dp[j] = grid[i][j];
} else if (i == 0) {
// If we're on the first row, we can only come from the left
dp[j] = dp[j - 1] + grid[i][j];
} else if (j == 0) {
// If we're on the first column, we can only come from above
dp[j] = dp[j] + grid[i][j];
} else {
// Otherwise, take the minimum path sum from either the left or above
dp[j] = Math.min(dp[j], dp[j - 1]) + grid[i][j];
}
});
});
// The last element contains the minimum path sum to the bottom-right corner
return dp[n - 1];
}
}
解释
方法:
时间复杂度:
空间复杂度:
代码细节讲解
相关问题
不同路径
一个机器人位于一个 m x n
网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
示例 1:

输入:m = 3, n = 7 输出:28
示例 2:
输入:m = 3, n = 2 输出:3 解释: 从左上角开始,总共有 3 条路径可以到达右下角。 1. 向右 -> 向下 -> 向下 2. 向下 -> 向下 -> 向右 3. 向下 -> 向右 -> 向下
示例 3:
输入:m = 7, n = 3 输出:28
示例 4:
输入:m = 3, n = 3 输出:6
提示:
1 <= m, n <= 100
- 题目数据保证答案小于等于
2 * 109
地下城游戏
恶魔们抓住了公主并将她关在了地下城 dungeon
的 右下角 。地下城是由 m x n
个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。
骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。
有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则表示骑士将增加健康点数)。
为了尽快解救公主,骑士决定每次只 向右 或 向下 移动一步。
返回确保骑士能够拯救到公主所需的最低初始健康点数。
注意:任何房间都可能对骑士的健康点数造成威胁,也可能增加骑士的健康点数,包括骑士进入的左上角房间以及公主被监禁的右下角房间。
示例 1:

输入:dungeon = [[-2,-3,3],[-5,-10,1],[10,30,-5]] 输出:7 解释:如果骑士遵循最佳路径:右 -> 右 -> 下 -> 下 ,则骑士的初始健康点数至少为 7 。
示例 2:
输入:dungeon = [[0]] 输出:1
提示:
m == dungeon.length
n == dungeon[i].length
1 <= m, n <= 200
-1000 <= dungeon[i][j] <= 1000
摘樱桃
给你一个 n x n
的网格 grid
,代表一块樱桃地,每个格子由以下三种数字的一种来表示:
0
表示这个格子是空的,所以你可以穿过它。1
表示这个格子里装着一个樱桃,你可以摘到樱桃然后穿过它。-1
表示这个格子里有荆棘,挡着你的路。
请你统计并返回:在遵守下列规则的情况下,能摘到的最多樱桃数:
- 从位置
(0, 0)
出发,最后到达(n - 1, n - 1)
,只能向下或向右走,并且只能穿越有效的格子(即只可以穿过值为0
或者1
的格子); - 当到达
(n - 1, n - 1)
后,你要继续走,直到返回到(0, 0)
,只能向上或向左走,并且只能穿越有效的格子; - 当你经过一个格子且这个格子包含一个樱桃时,你将摘到樱桃并且这个格子会变成空的(值变为
0
); - 如果在
(0, 0)
和(n - 1, n - 1)
之间不存在一条可经过的路径,则无法摘到任何一个樱桃。
示例 1:

输入:grid = [[0,1,-1],[1,0,-1],[1,1,1]] 输出:5 解释:玩家从 (0, 0) 出发:向下、向下、向右、向右移动至 (2, 2) 。 在这一次行程中捡到 4 个樱桃,矩阵变成 [[0,1,-1],[0,0,-1],[0,0,0]] 。 然后,玩家向左、向上、向上、向左返回起点,再捡到 1 个樱桃。 总共捡到 5 个樱桃,这是最大可能值。
示例 2:
输入:grid = [[1,1,-1],[1,-1,1],[-1,1,1]] 输出:0
提示:
n == grid.length
n == grid[i].length
1 <= n <= 50
grid[i][j]
为-1
、0
或1
grid[0][0] != -1
grid[n - 1][n - 1] != -1