Skip to content

Commit 10ac13a

Browse files
committed
feat: add solutions to lc problem: No.0064
No.0064.Minimum Path Sum
1 parent 3c0365e commit 10ac13a

File tree

9 files changed

+248
-234
lines changed

9 files changed

+248
-234
lines changed

solution/0000-0099/0064.Minimum Path Sum/README.md

Lines changed: 81 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,17 @@
4444

4545
**方法一:动态规划**
4646

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]$
4848

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$ 分别是网格的行数和列数。
5058

5159
<!-- tabs:start -->
5260

@@ -58,15 +66,16 @@
5866
class Solution:
5967
def minPathSum(self, grid: List[List[int]]) -> int:
6068
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]
6271
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]
6473
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]
6675
for i in range(1, m):
6776
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]
7079
```
7180

7281
### **Java**
@@ -77,67 +86,45 @@ class Solution:
7786
class Solution {
7887
public int minPathSum(int[][] grid) {
7988
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];
8291
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];
8493
}
8594
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];
8796
}
8897
for (int i = 1; i < m; ++i) {
8998
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];
91100
}
92101
}
93-
return dp[m - 1][n - 1];
102+
return f[m - 1][n - 1];
94103
}
95104
}
96105
```
97106

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-
121107
### **C++**
122108

123109
```cpp
124110
class Solution {
125111
public:
126112
int minPathSum(vector<vector<int>>& grid) {
127113
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];
129116
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];
131118
}
132119
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];
134121
}
135122
for (int i = 1; i < m; ++i) {
136123
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];
138125
}
139126
}
140-
return dp[m - 1][n - 1];
127+
return f[m - 1][n - 1];
141128
}
142129
};
143130
```
@@ -147,23 +134,23 @@ public:
147134
```go
148135
func minPathSum(grid [][]int) int {
149136
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)
153140
}
154-
dp[0][0] = grid[0][0]
141+
f[0][0] = grid[0][0]
155142
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]
157144
}
158145
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]
160147
}
161148
for i := 1; i < m; i++ {
162149
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]
164151
}
165152
}
166-
return dp[m-1][n-1]
153+
return f[m-1][n-1]
167154
}
168155
169156
func min(a, b int) int {
@@ -174,30 +161,51 @@ func min(a, b int) int {
174161
}
175162
```
176163

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+
177189
### **C#**
178190

179191
```cs
180192
public class Solution {
181193
public int MinPathSum(int[][] grid) {
182194
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];
188199
}
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];
192202
}
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];
198206
}
199207
}
200-
return dp[m- 1, n - 1];
208+
return f[m - 1, n - 1];
201209
}
202210
}
203211
```
@@ -210,22 +218,24 @@ public class Solution {
210218
* @return {number}
211219
*/
212220
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];
217227
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];
219229
}
220230
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];
222232
}
223233
for (let i = 1; i < m; ++i) {
224234
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];
226236
}
227237
}
228-
return dp[m - 1][n - 1];
238+
return f[m - 1][n - 1];
229239
};
230240
```
231241

0 commit comments

Comments
 (0)