更新图床

This commit is contained in:
programmercarl
2023-03-10 14:02:32 +08:00
parent 2a9b627a90
commit 17cb4b45c7
134 changed files with 1169 additions and 829 deletions

View File

@@ -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
![](https://img-blog.csdnimg.cn/20210110174033215.png)
![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210110174033215.png)
* 输入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 @@
如图举例:
![62.不同路径](https://img-blog.csdnimg.cn/20201209113602700.png)
![62.不同路径](https://code-thinking-1253855093.file.myqcloud.com/pics/20201209113602700.png)
此时问题就可以转化为求二叉树叶子节点的个数,代码如下:
@@ -126,7 +133,7 @@ for (int j = 0; j < n; j++) dp[0][j] = 1;
如图所示:
![62.不同路径1](https://img-blog.csdnimg.cn/20201209113631392.png)
![62.不同路径1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201209113631392.png)
以上动规五部曲分析完毕C++代码如下:
@@ -175,7 +182,7 @@ public:
在这个图中可以看出一共mn的话无论怎么走走到终点都需要 m + n - 2 步。
![62.不同路径](https://img-blog.csdnimg.cn/20201209113602700.png)
![62.不同路径](https://code-thinking-1253855093.file.myqcloud.com/pics/20201209113602700-20230310120944078.png)
在这m + n - 2 步中,一定有 m - 1 步是要向下走的,不用管什么时候向下走。
@@ -185,7 +192,7 @@ public:
那么答案,如图所示:
![62.不同路径2](https://img-blog.csdnimg.cn/20201209113725324.png)
![62.不同路径2](https://code-thinking-1253855093.file.myqcloud.com/pics/20201209113725324.png)
**求组合的时候要防止两个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) {
}
//从00到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];
}
```