@@ -38,6 +38,7 @@ Output: 28
3838## 前置知识
3939
4040- 动态规划
41+ - 排列组合
4142
4243## 公司
4344
@@ -48,6 +49,12 @@ Output: 28
4849
4950## 思路
5051
52+ 首先这道题可以用排列组合的解法来解,需要一点高中的知识。
53+
54+ ![ ] ( https://tva1.sinaimg.cn/large/007S8ZIlly1giwviy6wj6j32b80u0792.jpg )
55+
56+ 而这道题我们用动态规划来解。
57+
5158这是一道典型的适合使用动态规划解决的题目,它和爬楼梯等都属于动态规划中最简单的题目,因此也经常会被用于面试之中。
5259
5360读完题目你就能想到动态规划的话,建立模型并解决恐怕不是难事。其实我们很容易看出,由于机器人只能右移动和下移动,
@@ -57,26 +64,6 @@ Output: 28
5764
5865代码大概是:
5966
60- JS Code:
61-
62- ``` js
63- const dp = [];
64- for (let i = 0 ; i < m + 1 ; i++ ) {
65- dp[i] = [];
66- dp[i][0 ] = 0 ;
67- }
68- for (let i = 0 ; i < n + 1 ; i++ ) {
69- dp[0 ][i] = 0 ;
70- }
71- for (let i = 1 ; i < m + 1 ; i++ ) {
72- for (let j = 1 ; j < n + 1 ; j++ ) {
73- dp[i][j] = j === 1 ? 1 : dp[i - 1 ][j] + dp[i][j - 1 ]; // 转移方程
74- }
75- }
76-
77- return dp[m][n];
78- ```
79-
8067Python Code:
8168
8269``` python
@@ -104,26 +91,25 @@ class Solution:
10491
10592当然你也可以使用记忆化递归的方式来进行,由于递归深度的原因,性能比上面的方法差不少:
10693
107- > 直接暴力递归的话会超时 。
94+ > 直接暴力递归的话可能会超时 。
10895
10996Python3 Code:
11097
11198``` python
11299class Solution :
113- visited = dict ()
114-
100+
101+ @lru_cache
115102 def uniquePaths (self , m : int , n : int ) -> int :
116- if (m, n) in self .visited:
117- return self .visited[(m, n)]
118103 if m == 1 or n == 1 :
119104 return 1
120105 cnt = self .uniquePaths(m - 1 , n) + self .uniquePaths(m, n - 1 )
121- self .visited[(m, n)] = cnt
122106 return cnt
123107```
124108
109+
125110## 关键点
126111
112+ - 排列组合原理
127113- 记忆化递归
128114- 基本动态规划问题
129115- 空间复杂度可以进一步优化到 O(n), 这会是一个考点
0 commit comments