mirror of
https://github.com/ShusenTang/LeetCode.git
synced 2024-09-02 14:20:01 +00:00
Update 62. Unique Paths.md
This commit is contained in:
parent
e4383139a9
commit
70a8399129
@ -1,11 +1,19 @@
|
|||||||
# [62. Unique Paths](https://leetcode.com/problems/unique-paths/)
|
# [62. Unique Paths](https://leetcode.com/problems/unique-paths/)
|
||||||
# 思路
|
# 思路
|
||||||
|
## 思路一
|
||||||
题目要求从网格矩形的左上角移动到右下角共有多少可能的路径,一次移动只能向右或向下。
|
题目要求从网格矩形的左上角移动到右下角共有多少可能的路径,一次移动只能向右或向下。
|
||||||
就是一个简单的递归,设置一个大小为(m + 1)x(n + 1)的数组dp(初始值全为0), dp[i][j]代表从左上角到达位置第i行第j列的路径数,
|
就是一个简单的递归,设置一个大小为(m + 1)x(n + 1)的数组dp(初始值全为0), dp[i][j]代表从左上角到达位置第i行第j列的路径数,
|
||||||
则根据题意可知`dp[1][1] = 1`、`dp[i][j] += (dp[i - 1][j] + dp[i][j - 1])`。最终的返回结果就是dp[m][n]。
|
则根据题意可知`dp[1][1] = 1`、`dp[i][j] += (dp[i - 1][j] + dp[i][j - 1])`。最终的返回结果就是dp[m][n]。
|
||||||
时间复杂度O(mn),空间复杂度O(mn)
|
时间复杂度O(mn),空间复杂度O(mn)
|
||||||
|
|
||||||
|
## 思路二
|
||||||
|
这题就是之前高中做过的一个数学题。考虑mxn的网格,机器人要想到达目的地必须一共向下走m-1步、向右走n-1步,顺序不限。
|
||||||
|
所以这题转换成一个排列组合题: 有两种球分别m-1、n-1个,将这些球排成一排,一共有多少种排法?很明显答案是(m+n-2)!/[(m-1)!(n-1)!]种(即先进行全排列再消序)。
|
||||||
|
时间复杂度O(min(m, n)), 空间复杂度O(1)
|
||||||
|
|
||||||
|
|
||||||
# C++
|
# C++
|
||||||
|
## 思路一
|
||||||
``` C++
|
``` C++
|
||||||
class Solution {
|
class Solution {
|
||||||
public:
|
public:
|
||||||
@ -20,3 +28,22 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
## 思路二
|
||||||
|
``` C++
|
||||||
|
class Solution {
|
||||||
|
public:
|
||||||
|
int uniquePaths(int m, int n) {
|
||||||
|
if(m == 1 || n == 1) return 1;
|
||||||
|
long long res = 1, tmp = 1;
|
||||||
|
if(m < n){ // 保证m > n, 否则可能会溢出
|
||||||
|
int mbk = m;
|
||||||
|
m = n;
|
||||||
|
n = mbk;
|
||||||
|
}
|
||||||
|
for(int i = m; i <= m + n - 2; i++) res *= i; // 计算 (m + n - 2)! / (m - 1)!
|
||||||
|
for(int i = 2; i <= n - 1; i++) tmp *= i; // 计算 (n-1)!
|
||||||
|
res /= tmp;
|
||||||
|
return (int)res;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
```
|
||||||
|
Loading…
Reference in New Issue
Block a user