不同路径
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 19 ms, 内存: 16.0 MB
/*
题目思路:
我们将使用 Java Stream API 简化代码。考虑到我们只能从上方或左方到达某个点,可以用一维数组来存储路径数。
我们初始化一个数组 dp,大小为 n,表示从起点到每一列的路径数。
动态规划公式为:
dp[j] += dp[j-1]
其中 dp[j] 表示到达当前列的路径数,而 dp[j-1] 表示到达上一个列的路径数。
*/
import java.util.stream.IntStream;
public class UniquePathsStream {
public int uniquePaths(int m, int n) {
int[] dp = new int[n];
IntStream.range(0, n).forEach(i -> dp[i] = 1);
IntStream.range(1, m).forEach(i -> IntStream.range(1, n).forEach(j -> dp[j] += dp[j - 1]));
return dp[n - 1];
}
}
解释
方法:
该题解采用动态规划的方法解决问题。首先,定义一个二维数组 dp,其中 dp[i][j] 表示到达网格中第 i 行第 j 列的不同路径数量。初始化 dp 数组时,所有在第一行或第一列的位置只有一种方式到达,即全部向右或全部向下,因此将这些位置的值初始化为 1。对于其他位置 (i, j),机器人可以从左边 (i, j-1) 或上边 (i-1, j) 的单元格移动过来,因此 dp[i][j] 的值由这两种可能的位置的路径数之和决定,即 dp[i][j] = dp[i-1][j] + dp[i][j-1]。最终,dp数组的最后一个元素 dp[m-1][n-1] 即为所求答案。
时间复杂度:
O(m * n)
空间复杂度:
O(m * n)
代码细节讲解
🦆
在动态规划算法中,为什么将第一行和第一列的单元格初始化为1?这与网格的边界条件有什么关系?
▷🦆
动态规划解法中,dp数组的更新公式`dp[i][j] = dp[i-1][j] + dp[i][j-1]`是如何确保不会遗漏任何一条可能的路径的?
▷🦆
在初始化 dp 数组时,为什么选择使用列表推导式创建而不是直接分配一个固定值的二维列表?这样做有什么好处?
▷