Skip to content

Commit 5f90c65

Browse files
committed
feat: add solutions to lc problem: No.0064. Minimum Path Sum
1 parent 33a8f19 commit 5f90c65

File tree

5 files changed

+93
-34
lines changed

5 files changed

+93
-34
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,8 @@
191191
- [二维区域和检索 - 矩阵不可变](./solution/0300-0399/0304.Range%20Sum%20Query%202D%20-%20Immutable/README.md)
192192
- [不同路径](./solution/0000-0099/0062.Unique%20Paths/README.md)
193193
- [不同路径 II](./solution/0000-0099/0063.Unique%20Paths%20II/README.md)
194-
- [礼物的最大价值](./lcof/面试题47.%20礼物的最大价值/README.md)
195194
- [最小路径和](./solution/0000-0099/0064.Minimum%20Path%20Sum/README.md)
195+
- [礼物的最大价值](./lcof/面试题47.%20礼物的最大价值/README.md)
196196
- [最长上升子序列](./solution/0300-0399/0300.Longest%20Increasing%20Subsequence/README.md)
197197
- [俄罗斯套娃信封问题](./solution/0300-0399/0354.Russian%20Doll%20Envelopes/README.md)
198198
- [最长公共子序列](./solution/1100-1199/1143.Longest%20Common%20Subsequence/README.md)

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

+37-3
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@
4242

4343
<!-- 这里可写通用的实现逻辑 -->
4444

45-
动态规划法。
45+
动态规划。假设 `dp[i][j]` 表示到达网格 `(i,j)` 的最小数字和,先初始化 dp 第一列和第一行的所有值,然后利用递推公式:`dp[i][j] = min(dp[i -1][j], dp[i][j - 1]) + grid[i][j]` 求得 dp。
46+
47+
最后返回 `dp[m - 1][n - 1]` 即可。
4648

4749
<!-- tabs:start -->
4850

@@ -61,8 +63,8 @@ class Solution:
6163
dp[0][j] = dp[0][j - 1] + grid[0][j]
6264
for i in range(1, m):
6365
for j in range(1, n):
64-
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]
65-
return dp[m - 1][n - 1]
66+
dp[i][j] = min(dp[i -1][j], dp[i][j - 1]) + grid[i][j]
67+
return dp[-1][-1]
6668
```
6769

6870
### **Java**
@@ -115,6 +117,38 @@ public:
115117
};
116118
```
117119
120+
### **Go**
121+
122+
```go
123+
func minPathSum(grid [][]int) int {
124+
m, n := len(grid), len(grid[0])
125+
dp := make([][]int, m)
126+
for i := 0; i < m; i++ {
127+
dp[i] = make([]int, n)
128+
}
129+
dp[0][0] = grid[0][0]
130+
for i := 1; i < m; i++ {
131+
dp[i][0] = dp[i-1][0] + grid[i][0]
132+
}
133+
for j := 1; j < n; j++ {
134+
dp[0][j] = dp[0][j-1] + grid[0][j]
135+
}
136+
for i := 1; i < m; i++ {
137+
for j := 1; j < n; j++ {
138+
dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
139+
}
140+
}
141+
return dp[m-1][n-1]
142+
}
143+
144+
func min(a, b int) int {
145+
if a < b {
146+
return a
147+
}
148+
return b
149+
}
150+
```
151+
118152
### **...**
119153

120154
```

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

+36-2
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636

3737
## Solutions
3838

39+
Dynamic programming.
40+
3941
<!-- tabs:start -->
4042

4143
### **Python3**
@@ -51,8 +53,8 @@ class Solution:
5153
dp[0][j] = dp[0][j - 1] + grid[0][j]
5254
for i in range(1, m):
5355
for j in range(1, n):
54-
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]
55-
return dp[m - 1][n - 1]
56+
dp[i][j] = min(dp[i -1][j], dp[i][j - 1]) + grid[i][j]
57+
return dp[-1][-1]
5658
```
5759

5860
### **Java**
@@ -103,6 +105,38 @@ public:
103105
};
104106
```
105107
108+
### **Go**
109+
110+
```go
111+
func minPathSum(grid [][]int) int {
112+
m, n := len(grid), len(grid[0])
113+
dp := make([][]int, m)
114+
for i := 0; i < m; i++ {
115+
dp[i] = make([]int, n)
116+
}
117+
dp[0][0] = grid[0][0]
118+
for i := 1; i < m; i++ {
119+
dp[i][0] = dp[i-1][0] + grid[i][0]
120+
}
121+
for j := 1; j < n; j++ {
122+
dp[0][j] = dp[0][j-1] + grid[0][j]
123+
}
124+
for i := 1; i < m; i++ {
125+
for j := 1; j < n; j++ {
126+
dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
127+
}
128+
}
129+
return dp[m-1][n-1]
130+
}
131+
132+
func min(a, b int) int {
133+
if a < b {
134+
return a
135+
}
136+
return b
137+
}
138+
```
139+
106140
### **...**
107141

108142
```
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,27 @@
1-
21
func minPathSum(grid [][]int) int {
3-
yl := len(grid)
4-
if yl == 0 {
5-
return 0
6-
}
7-
xl := len(grid[0])
8-
if xl == 0 {
9-
return 0
10-
}
11-
// malloc
12-
dp := make([][]int, yl)
13-
for i, _ := range dp {
14-
dp[i] = make([]int, xl)
2+
m, n := len(grid), len(grid[0])
3+
dp := make([][]int, m)
4+
for i := 0; i < m; i++ {
5+
dp[i] = make([]int, n)
156
}
167
dp[0][0] = grid[0][0]
17-
for i := 1; i < yl; i++ {
18-
dp[i][0] = grid[i][0] + dp[i-1][0]
8+
for i := 1; i < m; i++ {
9+
dp[i][0] = dp[i-1][0] + grid[i][0]
1910
}
20-
for j := 1; j < xl; j++ {
21-
dp[0][j] = grid[0][j] + dp[0][j-1]
11+
for j := 1; j < n; j++ {
12+
dp[0][j] = dp[0][j-1] + grid[0][j]
2213
}
23-
for i := 1; i < yl; i++ {
24-
for j := 1; j < xl; j++ {
25-
dp[i][j] = grid[i][j] + minInt(dp[i-1][j], dp[i][j-1])
14+
for i := 1; i < m; i++ {
15+
for j := 1; j < n; j++ {
16+
dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
2617
}
2718
}
28-
return dp[yl-1][xl-1]
19+
return dp[m-1][n-1]
2920
}
3021

31-
func minInt(x, y int) int {
32-
if x < y {
33-
return x
22+
func min(a, b int) int {
23+
if a < b {
24+
return a
3425
}
35-
return y
36-
}
26+
return b
27+
}

solution/0000-0099/0064.Minimum Path Sum/Solution.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ def minPathSum(self, grid: List[List[int]]) -> int:
88
dp[0][j] = dp[0][j - 1] + grid[0][j]
99
for i in range(1, m):
1010
for j in range(1, n):
11-
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]
12-
return dp[m - 1][n - 1]
11+
dp[i][j] = min(dp[i -1][j], dp[i][j - 1]) + grid[i][j]
12+
return dp[-1][-1]

0 commit comments

Comments
 (0)