44
44
45
45
** 方法一:动态规划**
46
46
47
- 假设 ` dp [i][j]` 表示到达网格 ` (i,j) ` 的最小数字和,先初始化 dp 第一列和第一行的所有值,然后利用递推公式: ` dp[i][j ] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j] ` 求得 dp 。
47
+ 我们定义 $f [ i] [ j ] $ 表示从左上角走到 $ (i, j)$ 位置的最小路径和。初始时 $f [ 0 ] [ 0 ] = grid [ 0 ] [ 0 ] $,答案为 $f [ m - 1] [ n - 1 ] $ 。
48
48
49
- 最后返回 ` dp[m - 1][n - 1] ` 即可。
49
+ 考虑 $f[ i] [ j ] $:
50
+
51
+ - 如果 $j = 0$,那么 $f[ i] [ j ] = f[ i - 1] [ j ] + grid[ i] [ j ] $;
52
+ - 如果 $i = 0$,那么 $f[ i] [ j ] = f[ i] [ j - 1 ] + grid[ i] [ j ] $;
53
+ - 如果 $i \gt 0$ 且 $j \gt 0$,那么 $f[ i] [ j ] = \min(f[ i - 1] [ j ] , f[ i] [ j - 1 ] ) + grid[ i] [ j ] $。
54
+
55
+ 最后返回 $f[ m - 1] [ n - 1 ] $ 即可。
56
+
57
+ 时间复杂度 $O(m \times n)$,空间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别是网格的行数和列数。
50
58
51
59
<!-- tabs:start -->
52
60
58
66
class Solution :
59
67
def minPathSum (self , grid : List[List[int ]]) -> int :
60
68
m, n = len (grid), len (grid[0 ])
61
- dp = [[grid[0 ][0 ]] * n for _ in range (m)]
69
+ f = [[0 ] * n for _ in range (m)]
70
+ f[0 ][0 ] = grid[0 ][0 ]
62
71
for i in range (1 , m):
63
- dp [i][0 ] = dp [i - 1 ][0 ] + grid[i][0 ]
72
+ f [i][0 ] = f [i - 1 ][0 ] + grid[i][0 ]
64
73
for j in range (1 , n):
65
- dp [0 ][j] = dp [0 ][j - 1 ] + grid[0 ][j]
74
+ f [0 ][j] = f [0 ][j - 1 ] + grid[0 ][j]
66
75
for i in range (1 , m):
67
76
for j in range (1 , n):
68
- dp [i][j] = min (dp [i - 1 ][j], dp [i][j - 1 ]) + grid[i][j]
69
- return dp [- 1 ][- 1 ]
77
+ f [i][j] = min (f [i - 1 ][j], f [i][j - 1 ]) + grid[i][j]
78
+ return f [- 1 ][- 1 ]
70
79
```
71
80
72
81
### ** Java**
@@ -77,67 +86,45 @@ class Solution:
77
86
class Solution {
78
87
public int minPathSum (int [][] grid ) {
79
88
int m = grid. length, n = grid[0 ]. length;
80
- int [][] dp = new int [m][n];
81
- dp [0 ][0 ] = grid[0 ][0 ];
89
+ int [][] f = new int [m][n];
90
+ f [0 ][0 ] = grid[0 ][0 ];
82
91
for (int i = 1 ; i < m; ++ i) {
83
- dp [i][0 ] = dp [i - 1 ][0 ] + grid[i][0 ];
92
+ f [i][0 ] = f [i - 1 ][0 ] + grid[i][0 ];
84
93
}
85
94
for (int j = 1 ; j < n; ++ j) {
86
- dp [0 ][j] = dp [0 ][j - 1 ] + grid[0 ][j];
95
+ f [0 ][j] = f [0 ][j - 1 ] + grid[0 ][j];
87
96
}
88
97
for (int i = 1 ; i < m; ++ i) {
89
98
for (int j = 1 ; j < n; ++ j) {
90
- dp [i][j] = Math . min(dp [i - 1 ][j], dp [i][j - 1 ]) + grid[i][j];
99
+ f [i][j] = Math . min(f [i - 1 ][j], f [i][j - 1 ]) + grid[i][j];
91
100
}
92
101
}
93
- return dp [m - 1 ][n - 1 ];
102
+ return f [m - 1 ][n - 1 ];
94
103
}
95
104
}
96
105
```
97
106
98
- ### ** TypeScript**
99
-
100
- ``` ts
101
- function minPathSum(grid : number [][]): number {
102
- let m = grid .length ,
103
- n = grid [0 ].length ;
104
- let dp = Array .from ({ length: m }, v => new Array (n ).fill (0 ));
105
- dp [0 ][0 ] = grid [0 ][0 ];
106
- for (let i = 1 ; i < m ; ++ i ) {
107
- dp [i ][0 ] = dp [i - 1 ][0 ] + grid [i ][0 ];
108
- }
109
- for (let j = 1 ; j < n ; ++ j ) {
110
- dp [0 ][j ] = dp [0 ][j - 1 ] + grid [0 ][j ];
111
- }
112
- for (let i = 1 ; i < m ; ++ i ) {
113
- for (let j = 1 ; j < n ; ++ j ) {
114
- dp [i ][j ] = Math .min (dp [i - 1 ][j ], dp [i ][j - 1 ]) + grid [i ][j ];
115
- }
116
- }
117
- return dp [m - 1 ][n - 1 ];
118
- }
119
- ```
120
-
121
107
### ** C++**
122
108
123
109
``` cpp
124
110
class Solution {
125
111
public:
126
112
int minPathSum(vector<vector<int >>& grid) {
127
113
int m = grid.size(), n = grid[ 0] .size();
128
- vector<vector<int >> dp(m, vector<int >(n, grid[ 0] [ 0 ] ));
114
+ int f[ m] [ n ] ;
115
+ f[ 0] [ 0 ] = grid[ 0] [ 0 ] ;
129
116
for (int i = 1; i < m; ++i) {
130
- dp [ i] [ 0 ] = dp [ i - 1] [ 0 ] + grid[ i] [ 0 ] ;
117
+ f [ i] [ 0 ] = f [ i - 1] [ 0 ] + grid[ i] [ 0 ] ;
131
118
}
132
119
for (int j = 1; j < n; ++j) {
133
- dp [ 0] [ j ] = dp [ 0] [ j - 1 ] + grid[ 0] [ j ] ;
120
+ f [ 0] [ j ] = f [ 0] [ j - 1 ] + grid[ 0] [ j ] ;
134
121
}
135
122
for (int i = 1; i < m; ++i) {
136
123
for (int j = 1; j < n; ++j) {
137
- dp [ i] [ j ] = min(dp [ i - 1] [ j ] , dp [ i] [ j - 1 ] ) + grid[ i] [ j ] ;
124
+ f [ i] [ j ] = min(f [ i - 1] [ j ] , f [ i] [ j - 1 ] ) + grid[ i] [ j ] ;
138
125
}
139
126
}
140
- return dp [ m - 1] [ n - 1 ] ;
127
+ return f [ m - 1] [ n - 1 ] ;
141
128
}
142
129
};
143
130
```
@@ -147,23 +134,23 @@ public:
147
134
```go
148
135
func minPathSum(grid [][]int) int {
149
136
m, n := len(grid), len(grid[0])
150
- dp := make([][]int, m)
151
- for i := 0; i < m; i++ {
152
- dp [i] = make([]int, n)
137
+ f := make([][]int, m)
138
+ for i := range f {
139
+ f [i] = make([]int, n)
153
140
}
154
- dp [0][0] = grid[0][0]
141
+ f [0][0] = grid[0][0]
155
142
for i := 1; i < m; i++ {
156
- dp [i][0] = dp [i-1][0] + grid[i][0]
143
+ f [i][0] = f [i-1][0] + grid[i][0]
157
144
}
158
145
for j := 1; j < n; j++ {
159
- dp [0][j] = dp [0][j-1] + grid[0][j]
146
+ f [0][j] = f [0][j-1] + grid[0][j]
160
147
}
161
148
for i := 1; i < m; i++ {
162
149
for j := 1; j < n; j++ {
163
- dp [i][j] = min(dp [i-1][j], dp [i][j-1]) + grid[i][j]
150
+ f [i][j] = min(f [i-1][j], f [i][j-1]) + grid[i][j]
164
151
}
165
152
}
166
- return dp [m-1][n-1]
153
+ return f [m-1][n-1]
167
154
}
168
155
169
156
func min(a, b int) int {
@@ -174,30 +161,51 @@ func min(a, b int) int {
174
161
}
175
162
```
176
163
164
+ ### ** TypeScript**
165
+
166
+ ``` ts
167
+ function minPathSum(grid : number [][]): number {
168
+ const m = grid .length ;
169
+ const n = grid [0 ].length ;
170
+ const f: number [][] = Array (m )
171
+ .fill (0 )
172
+ .map (() => Array (n ).fill (0 ));
173
+ f [0 ][0 ] = grid [0 ][0 ];
174
+ for (let i = 1 ; i < m ; ++ i ) {
175
+ f [i ][0 ] = f [i - 1 ][0 ] + grid [i ][0 ];
176
+ }
177
+ for (let j = 1 ; j < n ; ++ j ) {
178
+ f [0 ][j ] = f [0 ][j - 1 ] + grid [0 ][j ];
179
+ }
180
+ for (let i = 1 ; i < m ; ++ i ) {
181
+ for (let j = 1 ; j < n ; ++ j ) {
182
+ f [i ][j ] = Math .min (f [i - 1 ][j ], f [i ][j - 1 ]) + grid [i ][j ];
183
+ }
184
+ }
185
+ return f [m - 1 ][n - 1 ];
186
+ }
187
+ ```
188
+
177
189
### ** C#**
178
190
179
191
``` cs
180
192
public class Solution {
181
193
public int MinPathSum (int [][] grid ) {
182
194
int m = grid .Length , n = grid [0 ].Length ;
183
- int [,] dp = new int [m , n ];
184
- dp [0 , 0 ] = grid [0 ][0 ];
185
- for (int i = 1 ; i < m ; ++ i )
186
- {
187
- dp [i , 0 ] = dp [i - 1 , 0 ] + grid [i ][0 ];
195
+ int [,] f = new int [m , n ];
196
+ f [0 , 0 ] = grid [0 ][0 ];
197
+ for (int i = 1 ; i < m ; ++ i ) {
198
+ f [i , 0 ] = f [i - 1 , 0 ] + grid [i ][0 ];
188
199
}
189
- for (int j = 1 ; j < n ; ++ j )
190
- {
191
- dp [0 , j ] = dp [0 , j - 1 ] + grid [0 ][j ];
200
+ for (int j = 1 ; j < n ; ++ j ) {
201
+ f [0 , j ] = f [0 , j - 1 ] + grid [0 ][j ];
192
202
}
193
- for (int i = 1 ; i < m ; ++ i )
194
- {
195
- for (int j = 1 ; j < n ; ++ j )
196
- {
197
- dp [i , j ] = Math .Min (dp [i - 1 , j ], dp [i , j - 1 ]) + grid [i ][j ];
203
+ for (int i = 1 ; i < m ; ++ i ) {
204
+ for (int j = 1 ; j < n ; ++ j ) {
205
+ f [i , j ] = Math .Min (f [i - 1 , j ], f [i , j - 1 ]) + grid [i ][j ];
198
206
}
199
207
}
200
- return dp [ m - 1 , n - 1 ];
208
+ return f [ m - 1 , n - 1 ];
201
209
}
202
210
}
203
211
```
@@ -210,22 +218,24 @@ public class Solution {
210
218
* @return {number}
211
219
*/
212
220
var minPathSum = function (grid ) {
213
- let m = grid .length ,
214
- n = grid[0 ].length ;
215
- let dp = Array .from ({ length: m }, v => new Array (n).fill (0 ));
216
- dp[0 ][0 ] = grid[0 ][0 ];
221
+ const m = grid .length ;
222
+ const n = grid[0 ].length ;
223
+ const f = Array (m)
224
+ .fill (0 )
225
+ .map (() => Array (n).fill (0 ));
226
+ f[0 ][0 ] = grid[0 ][0 ];
217
227
for (let i = 1 ; i < m; ++ i) {
218
- dp [i][0 ] = dp [i - 1 ][0 ] + grid[i][0 ];
228
+ f [i][0 ] = f [i - 1 ][0 ] + grid[i][0 ];
219
229
}
220
230
for (let j = 1 ; j < n; ++ j) {
221
- dp [0 ][j] = dp [0 ][j - 1 ] + grid[0 ][j];
231
+ f [0 ][j] = f [0 ][j - 1 ] + grid[0 ][j];
222
232
}
223
233
for (let i = 1 ; i < m; ++ i) {
224
234
for (let j = 1 ; j < n; ++ j) {
225
- dp [i][j] = Math .min (dp [i - 1 ][j], dp [i][j - 1 ]) + grid[i][j];
235
+ f [i][j] = Math .min (f [i - 1 ][j], f [i][j - 1 ]) + grid[i][j];
226
236
}
227
237
}
228
- return dp [m - 1 ][n - 1 ];
238
+ return f [m - 1 ][n - 1 ];
229
239
};
230
240
```
231
241
0 commit comments