隐藏网格下的最小消耗路径
难度:
标签:
题目描述
代码结果
运行时间: 596 ms, 内存: 25.8 MB
/*
题目思路:
1. 使用Java Streams来解决这个问题,主要还是通过动态规划的思想。
2. 创建一个二维数组dp,其中dp[i][j]表示从左上角到(i,j)的最小能量消耗。
3. 初始化第一行和第一列的值,然后通过迭代填充剩余的dp数组。
*/
import java.util.stream.IntStream;
public class MinCostPathStream {
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];
// 初始化第一行
IntStream.range(1, n).forEach(j -> dp[0][j] = dp[0][j - 1] + grid[0][j]);
// 初始化第一列
IntStream.range(1, m).forEach(i -> dp[i][0] = dp[i - 1][0] + grid[i][0]);
// 填充dp数组
IntStream.range(1, m).forEach(i ->
IntStream.range(1, n).forEach(j ->
dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]
)
);
return dp[m - 1][n - 1];
}
public static void main(String[] args) {
MinCostPathStream solution = new MinCostPathStream();
int[][] grid = {
{1, 3, 1},
{1, 5, 1},
{4, 2, 1}
};
System.out.println(solution.minPathSum(grid)); // 输出7
}
}
解释
方法:
这个题解利用了DFS和Dijkstra算法的结合来寻找从起点到目标的最短路径。首先,使用DFS从初始位置开始,探索所有可以移动到的单元格,同时记录每个单元格的移动成本和标记是否为目标。然后,使用Dijkstra算法从起点开始,根据已知的成本和距离,计算到每个可达单元格的最小路径成本。如果找到目标单元格,则返回到该单元格的最小成本。
时间复杂度:
O(N + M log M)
空间复杂度:
O(N)
代码细节讲解
🦆
如何确保DFS在遍历网格时不会重复访问同一个单元格,从而导致无限循环?
▷🦆
在DFS过程中,如果一个方向不可移动,你将其成本标记为负无穷,这对Dijkstra算法的执行有何影响?
▷🦆
Dijkstra算法中使用的最小堆(Min-heap)是如何确保我们总是找到当前成本最低的路径?
▷🦆
在题解中提到如果目标单元格不可达则返回-1,如何从算法的执行中准确判断出目标单元格是不可达的?
▷