更新图床
This commit is contained in:
@@ -1,14 +1,16 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="https://programmercarl.com/other/xunlianying.html" target="_blank">
|
||||
<img src="../pics/训练营.png" width="1000"/>
|
||||
</a>
|
||||
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
|
||||
|
||||
|
||||
# 62.不同路径
|
||||
|
||||
[力扣题目链接](https://leetcode.cn/problems/unique-paths/)
|
||||
|
||||
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
|
||||
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
|
||||
|
||||
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
|
||||
|
||||
@@ -16,30 +18,35 @@
|
||||
|
||||
示例 1:
|
||||
|
||||

|
||||

|
||||
|
||||
* 输入:m = 3, n = 7
|
||||
* 输出:28
|
||||
|
||||
示例 2:
|
||||
|
||||
* 输入:m = 2, n = 3
|
||||
* 输出:3
|
||||
|
||||
解释: 从左上角开始,总共有 3 条路径可以到达右下角。
|
||||
|
||||
1. 向右 -> 向右 -> 向下
|
||||
2. 向右 -> 向下 -> 向右
|
||||
3. 向下 -> 向右 -> 向右
|
||||
|
||||
|
||||
示例 3:
|
||||
|
||||
* 输入:m = 7, n = 3
|
||||
* 输出:28
|
||||
|
||||
示例 4:
|
||||
|
||||
* 输入:m = 3, n = 3
|
||||
* 输出:6
|
||||
|
||||
提示:
|
||||
|
||||
* 1 <= m, n <= 100
|
||||
* 题目数据保证答案小于等于 2 * 10^9
|
||||
|
||||
@@ -57,7 +64,7 @@
|
||||
|
||||
如图举例:
|
||||
|
||||

|
||||

|
||||
|
||||
此时问题就可以转化为求二叉树叶子节点的个数,代码如下:
|
||||
|
||||
@@ -126,7 +133,7 @@ for (int j = 0; j < n; j++) dp[0][j] = 1;
|
||||
|
||||
如图所示:
|
||||
|
||||

|
||||

|
||||
|
||||
以上动规五部曲分析完毕,C++代码如下:
|
||||
|
||||
@@ -175,7 +182,7 @@ public:
|
||||
|
||||
在这个图中,可以看出一共m,n的话,无论怎么走,走到终点都需要 m + n - 2 步。
|
||||
|
||||

|
||||

|
||||
|
||||
在这m + n - 2 步中,一定有 m - 1 步是要向下走的,不用管什么时候向下走。
|
||||
|
||||
@@ -185,7 +192,7 @@ public:
|
||||
|
||||
那么答案,如图所示:
|
||||
|
||||

|
||||

|
||||
|
||||
**求组合的时候,要防止两个int相乘溢出!** 所以不能把算式的分子都算出来,分母都算出来再做除法。
|
||||
|
||||
@@ -245,7 +252,8 @@ public:
|
||||
## 其他语言版本
|
||||
|
||||
|
||||
### Java
|
||||
### Java
|
||||
|
||||
```java
|
||||
/**
|
||||
* 1. 确定dp数组下标含义 dp[i][j] 到每一个坐标可能的路径种类
|
||||
@@ -278,7 +286,8 @@ public:
|
||||
|
||||
```
|
||||
|
||||
### Python
|
||||
### Python
|
||||
|
||||
```python
|
||||
class Solution: # 动态规划
|
||||
def uniquePaths(self, m: int, n: int) -> int:
|
||||
@@ -289,7 +298,8 @@ class Solution: # 动态规划
|
||||
return dp[m - 1][n - 1]
|
||||
```
|
||||
|
||||
### Go
|
||||
### Go
|
||||
|
||||
```Go
|
||||
func uniquePaths(m int, n int) int {
|
||||
dp := make([][]int, m)
|
||||
@@ -309,19 +319,20 @@ func uniquePaths(m int, n int) int {
|
||||
}
|
||||
```
|
||||
|
||||
### Javascript
|
||||
### Javascript
|
||||
|
||||
```Javascript
|
||||
var uniquePaths = function(m, n) {
|
||||
const dp = Array(m).fill().map(item => Array(n))
|
||||
|
||||
|
||||
for (let i = 0; i < m; ++i) {
|
||||
dp[i][0] = 1
|
||||
}
|
||||
|
||||
|
||||
for (let i = 0; i < n; ++i) {
|
||||
dp[0][i] = 1
|
||||
}
|
||||
|
||||
|
||||
for (let i = 1; i < m; ++i) {
|
||||
for (let j = 1; j < n; ++j) {
|
||||
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
|
||||
@@ -330,7 +341,9 @@ var uniquePaths = function(m, n) {
|
||||
return dp[m - 1][n - 1]
|
||||
};
|
||||
```
|
||||
|
||||
>版本二:直接将dp数值值初始化为1
|
||||
|
||||
```javascript
|
||||
/**
|
||||
* @param {number} m
|
||||
@@ -414,9 +427,9 @@ int **initDP(int m, int n) {
|
||||
}
|
||||
|
||||
//从0,0到i,0只有一种走法,所以dp[i][0]都是1,同理dp[0][j]也是1
|
||||
for(i = 0; i < m; ++i)
|
||||
for(i = 0; i < m; ++i)
|
||||
dp[i][0] = 1;
|
||||
for(j = 0; j < n; ++j)
|
||||
for(j = 0; j < n; ++j)
|
||||
dp[0][j] = 1;
|
||||
return dp;
|
||||
}
|
||||
@@ -440,6 +453,7 @@ int uniquePaths(int m, int n){
|
||||
```
|
||||
|
||||
滚动数组解法:
|
||||
|
||||
```c
|
||||
int uniquePaths(int m, int n){
|
||||
int i, j;
|
||||
@@ -455,7 +469,7 @@ int uniquePaths(int m, int n){
|
||||
dp[i] += dp[i - 1];
|
||||
}
|
||||
}
|
||||
return dp[n - 1];
|
||||
return dp[n - 1];
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
Reference in New Issue
Block a user