算法leetcode|62. 不同路径(rust重拳出击)
发布人:shili8
发布时间:2025-01-04 15:04
阅读次数:0
**不同路径**
给定一个 `m x n` 的网格,且每个格子都可以看作是一个房间。从左上角开始,每一步只能向右或向下移动一步。请问有多少条不同的路径?
**示例1:**
输入:`numRows =3, numColumns =7`
输出:`28`
**示例2:**
输入:`numRows =3, numColumns =2`
输出:`3`
**示例3:**
输入:`numRows =7, numColumns =3`
输出:`28`
**解决方案**
这个问题可以使用动态规划来解决。我们可以创建一个 `dp` 数组,用于存储从左上角到每个格子的不同路径的数量。
rustfn unique_paths(m: i32, n: i32) -> i32 { let mut dp = vec![vec![0; n as usize]; m as usize]; // 初始化第一行和第一列 for i in0..m as usize { dp[i][0] =1; } for j in0..n as usize { dp[0][j] =1; } // 填充dp数组 for i in1..m as usize { for j in1..n as usize { dp[i][j] = dp[i -1][j] + dp[i][j -1]; } } return dp[m as usize -1][n as usize -1]; }
**解释**
我们首先初始化 `dp` 数组,第一行和第一列都设置为1,因为从左上角到每个格子只有一个路径。
然后,我们填充 `dp` 数组。对于每个格子 `(i, j)`,其值等于从左上角到 `(i -1, j)` 的不同路径数量加上从左上角到 `(i, j -1)` 的不同路径数量。这是因为我们可以从左上角移动到 `(i -1, j)` 或 `(i, j -1)`,然后再移动一步到 `(i, j)`。
最终答案是 `dp[m as usize -1][n as usize -1]`,即从左上角到右下角的不同路径数量。
**时间复杂度**
时间复杂度为 O(m * n),因为我们需要填充一个 m x n 的数组。
**空间复杂度**
空间复杂度为 O(m * n),因为我们需要存储一个 m x n 的数组。