60
60
61
61
** 方法一:动态规划**
62
62
63
- 假设 ` dp[i][j] ` 表示到达网格 ` (i, j) ` 的路径数,则 ` dp[i][j] = dp[i - 1][j] + dp[i][j - 1] ` 。
63
+ 我们定义 $f[ i] [ j ] $ 表示从左上角走到 $(i, j)$ 的路径数量,初始时 $f[ 0] [ 0 ] = 1$,答案为 $f[ m - 1] [ n - 1 ] $。
64
+
65
+ 考虑 $f[ i] [ j ] $:
66
+
67
+ - 如果 $i \gt 0$,那么 $f[ i] [ j ] $ 可以从 $f[ i - 1] [ j ] $ 走一步到达,因此 $f[ i] [ j ] = f[ i] [ j ] + f[ i - 1] [ j ] $;
68
+ - 如果 $j \gt 0$,那么 $f[ i] [ j ] $ 可以从 $f[ i] [ j - 1 ] $ 走一步到达,因此 $f[ i] [ j ] = f[ i] [ j ] + f[ i] [ j - 1 ] $。
69
+
70
+ 因此,我们有如下的状态转移方程:
71
+
72
+ $$
73
+ f[i][j] = \begin{cases}
74
+ 1 & i = 0, j = 0 \\
75
+ f[i - 1][j] + f[i][j - 1] & \text{otherwise}
76
+ \end{cases}
77
+ $$
78
+
79
+ 最终的答案即为 $f[ m - 1] [ n - 1 ] $。
80
+
81
+ 时间复杂度 $O(m \times n)$,空间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别是网格的行数和列数。
64
82
65
83
<!-- tabs:start -->
66
84
71
89
``` python
72
90
class Solution :
73
91
def uniquePaths (self , m : int , n : int ) -> int :
74
- dp = [[1 ] * n for _ in range (m)]
92
+ f = [[0 ] * n for _ in range (m)]
93
+ f[0 ][0 ] = 1
94
+ for i in range (m):
95
+ for j in range (n):
96
+ if i:
97
+ f[i][j] += f[i - 1 ][j]
98
+ if j:
99
+ f[i][j] += f[i][j - 1 ]
100
+ return f[- 1 ][- 1 ]
101
+ ```
102
+
103
+ ``` python
104
+ class Solution :
105
+ def uniquePaths (self , m : int , n : int ) -> int :
106
+ f = [[1 ] * n for _ in range (m)]
75
107
for i in range (1 , m):
76
108
for j in range (1 , n):
77
- dp [i][j] = dp [i - 1 ][j] + dp [i][j - 1 ]
78
- return dp [- 1 ][- 1 ]
109
+ f [i][j] = f [i - 1 ][j] + f [i][j - 1 ]
110
+ return f [- 1 ][- 1 ]
79
111
```
80
112
81
113
### ** Java**
@@ -85,31 +117,37 @@ class Solution:
85
117
``` java
86
118
class Solution {
87
119
public int uniquePaths (int m , int n ) {
88
- int [][] dp = new int [m][n];
120
+ var f = new int [m][n];
121
+ f[0 ][0 ] = 1 ;
89
122
for (int i = 0 ; i < m; ++ i) {
90
- Arrays . fill(dp[i], 1 );
91
- }
92
- for (int i = 1 ; i < m; ++ i) {
93
- for (int j = 1 ; j < n; ++ j) {
94
- dp[i][j] = dp[i - 1 ][j] + dp[i][j - 1 ];
123
+ for (int j = 0 ; j < n; ++ j) {
124
+ if (i > 0 ) {
125
+ f[i][j] += f[i - 1 ][j];
126
+ }
127
+ if (j > 0 ) {
128
+ f[i][j] += f[i][j - 1 ];
129
+ }
95
130
}
96
131
}
97
- return dp [m - 1 ][n - 1 ];
132
+ return f [m - 1 ][n - 1 ];
98
133
}
99
134
}
100
135
```
101
136
102
- ### ** TypeScript**
103
-
104
- ``` ts
105
- function uniquePaths(m : number , n : number ): number {
106
- let dp = Array .from ({ length: m }, v => new Array (n ).fill (1 ));
107
- for (let i = 1 ; i < m ; ++ i ) {
108
- for (let j = 1 ; j < n ; ++ j ) {
109
- dp [i ][j ] = dp [i - 1 ][j ] + dp [i ][j - 1 ];
137
+ ``` java
138
+ class Solution {
139
+ public int uniquePaths (int m , int n ) {
140
+ var f = new int [m][n];
141
+ for (var g : f) {
142
+ Arrays . fill(g, 1 );
143
+ }
144
+ for (int i = 1 ; i < m; ++ i) {
145
+ for (int j = 1 ; j < n; j++ ) {
146
+ f[i][j] = f[i - 1 ][j] + f[i][j - 1 ];
147
+ }
110
148
}
149
+ return f[m - 1 ][n - 1 ];
111
150
}
112
- return dp [m - 1 ][n - 1 ];
113
151
}
114
152
```
115
153
@@ -119,13 +157,34 @@ function uniquePaths(m: number, n: number): number {
119
157
class Solution {
120
158
public:
121
159
int uniquePaths(int m, int n) {
122
- vector<vector<int >> dp(m, vector<int >(n, 1));
160
+ vector<vector<int >> f(m, vector<int >(n));
161
+ f[ 0] [ 0 ] = 1;
162
+ for (int i = 0; i < m; ++i) {
163
+ for (int j = 0; j < n; ++j) {
164
+ if (i) {
165
+ f[ i] [ j ] += f[ i - 1] [ j ] ;
166
+ }
167
+ if (j) {
168
+ f[ i] [ j ] += f[ i] [ j - 1 ] ;
169
+ }
170
+ }
171
+ }
172
+ return f[ m - 1] [ n - 1 ] ;
173
+ }
174
+ };
175
+ ```
176
+
177
+ ```cpp
178
+ class Solution {
179
+ public:
180
+ int uniquePaths(int m, int n) {
181
+ vector<vector<int>> f(m, vector<int>(n, 1));
123
182
for (int i = 1; i < m; ++i) {
124
183
for (int j = 1; j < n; ++j) {
125
- dp [ i] [ j ] = dp [ i - 1] [ j ] + dp [ i] [ j - 1 ] ;
184
+ f [i][j] = f [i - 1][j] + f [i][j - 1];
126
185
}
127
186
}
128
- return dp [ m - 1] [ n - 1 ] ;
187
+ return f [m - 1][n - 1];
129
188
}
130
189
};
131
190
```
@@ -134,23 +193,125 @@ public:
134
193
135
194
``` go
136
195
func uniquePaths (m int , n int ) int {
137
- dp := make([][]int, m)
138
- for i := 0; i < m; i++ {
139
- dp [i] = make([]int, n)
196
+ f := make ([][]int , m)
197
+ for i := range f {
198
+ f [i] = make ([]int , n)
140
199
}
200
+ f[0 ][0 ] = 1
141
201
for i := 0 ; i < m; i++ {
142
202
for j := 0 ; j < n; j++ {
143
- if i == 0 || j == 0 {
144
- dp[i][j] = 1
145
- } else {
146
- dp[i][j] = dp[i-1][j] + dp[i][j-1]
203
+ if i > 0 {
204
+ f[i][j] += f[i-1 ][j]
205
+ }
206
+ if j > 0 {
207
+ f[i][j] += f[i][j-1 ]
147
208
}
148
209
}
149
210
}
150
- return dp[m-1][n-1]
211
+ return f[m-1 ][n-1 ]
212
+ }
213
+ ```
214
+
215
+ ``` go
216
+ func uniquePaths (m int , n int ) int {
217
+ f := make ([][]int , m)
218
+ for i := range f {
219
+ f[i] = make ([]int , n)
220
+ for j := range f[i] {
221
+ f[i][j] = 1
222
+ }
223
+ }
224
+ for i := 1 ; i < m; i++ {
225
+ for j := 1 ; j < n; j++ {
226
+ f[i][j] = f[i-1 ][j] + f[i][j-1 ]
227
+ }
228
+ }
229
+ return f[m-1 ][n-1 ]
151
230
}
152
231
```
153
232
233
+ ### ** TypeScript**
234
+
235
+ ``` ts
236
+ function uniquePaths(m : number , n : number ): number {
237
+ const f: number [][] = Array (m )
238
+ .fill (0 )
239
+ .map (() => Array (n ).fill (0 ));
240
+ f [0 ][0 ] = 1 ;
241
+ for (let i = 0 ; i < m ; ++ i ) {
242
+ for (let j = 0 ; j < n ; ++ j ) {
243
+ if (i > 0 ) {
244
+ f [i ][j ] += f [i - 1 ][j ];
245
+ }
246
+ if (j > 0 ) {
247
+ f [i ][j ] += f [i ][j - 1 ];
248
+ }
249
+ }
250
+ }
251
+ return f [m - 1 ][n - 1 ];
252
+ }
253
+ ```
254
+
255
+ ``` ts
256
+ function uniquePaths(m : number , n : number ): number {
257
+ const f: number [][] = Array (m )
258
+ .fill (0 )
259
+ .map (() => Array (n ).fill (1 ));
260
+ for (let i = 1 ; i < m ; ++ i ) {
261
+ for (let j = 1 ; j < n ; ++ j ) {
262
+ f [i ][j ] = f [i - 1 ][j ] + f [i ][j - 1 ];
263
+ }
264
+ }
265
+ return f [m - 1 ][n - 1 ];
266
+ }
267
+ ```
268
+
269
+ ### ** JavaScript**
270
+
271
+ ``` js
272
+ /**
273
+ * @param {number} m
274
+ * @param {number} n
275
+ * @return {number}
276
+ */
277
+ var uniquePaths = function (m , n ) {
278
+ const f = Array (m)
279
+ .fill (0 )
280
+ .map (() => Array (n).fill (0 ));
281
+ f[0 ][0 ] = 1 ;
282
+ for (let i = 0 ; i < m; ++ i) {
283
+ for (let j = 0 ; j < n; ++ j) {
284
+ if (i > 0 ) {
285
+ f[i][j] += f[i - 1 ][j];
286
+ }
287
+ if (j > 0 ) {
288
+ f[i][j] += f[i][j - 1 ];
289
+ }
290
+ }
291
+ }
292
+ return f[m - 1 ][n - 1 ];
293
+ };
294
+ ```
295
+
296
+ ``` js
297
+ /**
298
+ * @param {number} m
299
+ * @param {number} n
300
+ * @return {number}
301
+ */
302
+ var uniquePaths = function (m , n ) {
303
+ const f = Array (m)
304
+ .fill (0 )
305
+ .map (() => Array (n).fill (1 ));
306
+ for (let i = 1 ; i < m; ++ i) {
307
+ for (let j = 1 ; j < n; ++ j) {
308
+ f[i][j] = f[i - 1 ][j] + f[i][j - 1 ];
309
+ }
310
+ }
311
+ return f[m - 1 ][n - 1 ];
312
+ };
313
+ ```
314
+
154
315
### ** Rust**
155
316
156
317
``` rust
0 commit comments